Halo
发布于 2024-10-29 / 36 阅读 / 0 评论 / 0 点赞

浅拷贝和深拷贝

在Python中,浅拷贝(shallow copy)意味着创建一个新的对象,但它包含的是对原始对象中项的引用。如果原对象中的项是不可变的(如整数、字符串、元组),则更改副本不会影响原对象。但如果项是可变的(如列表、字典、类实例),则更改副本中的项可能会影响到原对象。

下面是一个关于浅拷贝的例子,其中原对象是一个包含可变项(列表)的列表:

import copy

# 原始列表
original_list = [[1, 2, 3], [4, 5, 6]]

# 创建一个浅拷贝
shallow_copied_list = copy.copy(original_list)

# 现在修改副本中的一个可变项(子列表)
shallow_copied_list[0][0] = "X"

# 输出原始列表,可以看到它也被改变了
print(original_list)  # 输出: [['X', 2, 3], [4, 5, 6]]

a = original_list
a[0][1] = "Y"

# 输出原始列表,可以看到它也被改变了
print(original_list)  # 输出: [['X', 'Y', 3], [4, 5, 6]]

在这个例子中,original_list 是一个包含两个列表的列表。使用 copy.copy() 创建了一个浅拷贝 shallow_copied_list。当我们修改 shallow_copied_list 中第一个子列表的第一个元素时,原始列表 original_list 中对应的元素也被改变了。这是因为浅拷贝只复制了一层,子列表对象的引用被复制了,而子列表对象本身并没有被复制。

因此,当我们更改副本中的子列表时,实际上是在更改原始列表中的同一个子列表,所以原始列表也表现出了变化。这就是浅拷贝中更改副本可能会影响到原对象的情形。


评论