Python二维列表初始化后修改元素整列变更的原因咨询
为什么修改二维列表的单个元素会导致整列变化?
这是Python里新手很容易踩的一个经典坑!咱们来把问题拆解开说清楚:
先看你初始化列表的代码:
dist = [[0]*3]*3
这里的核心问题出在***3的复制逻辑**上:当你用[0]*3生成一个包含三个0的子列表后,再用*3去复制这个子列表时,Python并不会为你创建三个全新的独立列表——它只是把同一个子列表的引用重复了三次。换句话说,dist里的三个子列表其实是同一个对象!
你可以用id()函数直观验证这一点:
dist = [[0]*3]*3 print(id(dist[0])) print(id(dist[1])) print(id(dist[2])) # 输出的三个id会完全相同,证明这三个子列表是同一个东西
所以当你执行dist[1][1] = 1时,你本质上是在修改那个唯一的子列表里的元素,而dist的三个位置都指向这个子列表,自然看起来就像是整列都被修改了。
正确的二维列表初始化方式
要创建真正互相独立的子列表,应该使用列表推导式:
dist = [[0]*3 for _ in range(3)]
这里的for _ in range(3)会循环三次,每次都会生成一个全新的[0]*3子列表,这样三个子列表就是完全独立的对象了。这时再修改dist[1][1] = 1,就只会改变指定位置的元素,结果会是:
[[0,0,0],[0,1,0],[0,0,0]]
内容的提问来源于stack exchange,提问作者Stanley Szeto
相关产品推荐
相关产品推荐

