我正在使用Python 3并使用以下代码:import randommat = [[0]*5]*5for i in range (0,5) : for j in range (0,5) : mat[i][j] = random.randint(10,50)print (mat)我得到这样的结果:[[26, 10, 28, 21, 15], [26, 10, 28, 21, 15], [26, 10, 28, 21, 15], [26, 10, 28, 21, 15], [26, 10, 28, 21, 15]]这些行彼此相等,但是循环似乎还不错。问题是什么?
2 回答

烙印99
TA贡献1829条经验 获得超13个赞
因为所有内部列表实际上都是同一对象的副本,所以修改其中一个列表也会自动影响其他列表。
>>> l = [[0]*5]*5
>>> [id(x) for x in l]
[155011468, 155011468, 155011468, 155011468, 155011468]
相同的ID意味着所有索引实际上都指向列表内的同一对象:
>>> l[0][0] = 1 #modifying one, changes all of them
>>> l
[[1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0]]
使用list comprehension解决此问题:
>>> l = [[0]*5 for _ in xrange(5)]
>>> [id(x) for x in l] #all lists are unique now
[155710028, 155710764, 155710700, 155710732, 155709996]
可以正常工作:
>>> l[0][0] = 1
>>> l
[[1, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
添加回答
举报
0/150
提交
取消