Python用切片复制嵌套列表后修改副本为何会改变原列表?
问题原因
Python的切片操作执行的是浅拷贝,对于嵌套列表这类包含可变子元素的结构,浅拷贝仅会创建新的外层列表容器,容器内存储的所有子元素仍然是原列表子元素的引用,没有生成独立的新子元素。
你的案例中b1 = a1[:]执行后:
- 外层的
b1是和a1独立的新列表对象,如果你直接修改外层元素比如执行b1[0] = ['X', 'Y'],不会影响原列表a1 - 但
b1[0]、b1[1]两个子列表和a1[0]、a1[1]指向完全相同的内存地址,修改子列表内部的元素时,两个列表会同步发生变化。
你可以通过打印内存地址验证该结论:
print(id(a1[1]) == id(b1[1])) # 输出为True,证明二者指向同一个子列表对象
解决方案
如果要实现修改拷贝完全不影响原列表,需要执行深拷贝,递归复制所有层级的可变对象:
import copy a1 = [['H', 'T'], ['T', 'T']] b1 = copy.deepcopy(a1) b1[1][1] = 'H' print(a1) # 输出 [['H', 'T'], ['T', 'T']],原列表不受影响
内容的提问来源于stack exchange,提问作者Ron Dsouza
相关产品推荐
相关产品推荐

