为何修改二维列表result[0][0]时所有子列表对应位置均被修改?
问题原因分析
你遇到的问题本质是Python中可变对象的引用机制导致的:
- 你先创建了一个列表
l = [0,0,0],然后连续三次把l添加到result中。这时候result里的三个元素并不是三个独立的列表,而是指向同一个列表对象的引用。 - 当你执行
result[i][j] = num修改其中一个子列表的元素时,实际上是在修改那个被共享的列表对象,所以所有指向它的引用(也就是result里的三个子列表)都会显示出这个修改。
验证方式
你可以打印每个子列表的内存地址来确认:
result=[] l=[] n=3 for _ in range(n): l.append(0) for _ in range(n): result.append(l) # 打印每个子列表的id for sub in result: print(id(sub))
输出的三个id会完全相同,证明它们是同一个对象。
解决方法
要让每个子列表都是独立的对象,需要每次添加时创建新的列表,比如:
- 每次循环生成新列表:
result=[] n=3 for _ in range(n): # 每次循环创建一个新的全0列表 result.append([0]*n)
- 或者复制已有列表的副本:
result=[] l=[] n=3 for _ in range(n): l.append(0) for _ in range(n): # 添加l的副本,而非原引用 result.append(l.copy())
这样修改result[0][0]时,就只会影响第一个子列表,其他子列表不受影响。
内容的提问来源于stack exchange,提问作者Anusha Yerram
相关产品推荐
相关产品推荐

