Python二维列表赋值疑问:list()复制后子列表为何同步变化?
为什么修改array1会影响array2?
这是个典型的**浅拷贝(shallow copy)**问题,我来一步步给你拆解清楚:
先看你的第一行代码:
array1=[[0 for rows in range(9)] for cols in range(9)]
这行创建了一个9×9的二维列表,外层列表里的每一个元素都是独立的、包含9个0的子列表。接下来的
array2=list(array1)
这里用list()对array1做了一次拷贝,但注意:这是浅拷贝。浅拷贝只会复制外层列表的结构——也就是说,array2是一个全新的外层列表(所以id(array1) is id(array2)会返回False,因为它们是两个不同的对象),但外层列表里的每一个子列表并没有被重新复制,array2里的子列表和array1里的子列表是完全同一个对象,共享同一块内存空间。最后你执行
array1[0][0]=1
这行代码并没有修改外层列表的元素(比如把第一个子列表换成另一个新列表),而是修改了第一个子列表内部的元素值。因为array2的第一个子列表和array1的第一个子列表是同一个对象,所以这个修改会直接反映在array2里,导致print(array2[0][0])输出1。
如果想要让array2完全独立于array1,不受array1修改的影响,你需要做深拷贝(deep copy),可以使用Python内置copy模块里的deepcopy方法:
import copy array1=[[0 for rows in range(9)] for cols in range(9)] array2=copy.deepcopy(array1) array1[0][0]=1 print(array2[0][0]) # 输出 0 print(id(array1) is id(array2)) # 输出 False
内容的提问来源于stack exchange,提问作者cotopaxillama
相关产品推荐
相关产品推荐

