Python:为什么矩阵上的randint总是给我相同的行

我正在使用Python 3并使用以下代码:


import random

mat = [[0]*5]*5


for 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]]

这些行彼此相等,但是循环似乎还不错。


问题是什么?


杨__羊羊
浏览 222回答 2
2回答

烙印99

因为所有内部列表实际上都是同一对象的副本,所以修改其中一个列表也会自动影响其他列表。>>> 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]]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python