在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
中对应的元素也被改变了。这是因为浅拷贝只复制了一层,子列表对象的引用被复制了,而子列表对象本身并没有被复制。
因此,当我们更改副本中的子列表时,实际上是在更改原始列表中的同一个子列表,所以原始列表也表现出了变化。这就是浅拷贝中更改副本可能会影响到原对象的情形。