为何修改矩阵单个元素会影响整列?Python矩阵赋值异常排查
为啥修改矩阵单个元素整列都变了?这是Python列表引用的经典坑!
兄弟,你碰到的这个问题我刚学Python的时候也踩过!咱们先看你的代码和实际输出:
p = [[0]*3]*3 p[0][0] = 5 for i in p: print(i)
输出结果:
[5, 0, 0]
[5, 0, 0]
[5, 0, 0]
问题根源
问题出在[[0]*3]*3这个创建方式上:
[0]*3确实生成了一个包含三个0的列表,但后面的*3并没有创建三个独立的新列表——它只是把同一个列表的引用复制了三次。- 换句话说,
p[0]、p[1]、p[2]指向的是内存里的同一个列表对象!所以你改p[0][0]的时候,其实是在修改那个共享的列表,三个行自然都跟着变了。
解决方法
用列表推导式创建矩阵,确保每个子列表都是独立的:
p = [[0]*3 for _ in range(3)] p[0][0] = 5 for i in p: print(i)
这次输出就正常了:
[5, 0, 0]
[0, 0, 0]
[0, 0, 0]
原理很简单:for _ in range(3)循环的每一次,都会重新生成一个[0]*3列表,三个子列表都是完全独立的对象,修改其中一个不会影响其他。
如果你觉得列表推导式有点抽象,也可以用普通循环写,效果完全一样:
p = [] for _ in range(3): new_row = [0]*3 p.append(new_row)
小提醒
Python里的可变对象(比如列表、字典)赋值时,传递的是引用不是副本,以后碰到类似的奇怪问题,先想想是不是不小心共享了同一个对象的引用哦~
内容的提问来源于stack exchange,提问作者Chris Border
相关产品推荐
相关产品推荐

