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

问题描述 投票:0回答:2

我正在使用 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]]

行彼此相等,但循环似乎没问题。

有什么问题吗?

python arrays random matrix rows
2个回答
4
投票

因为所有内部列表实际上都是同一个对象的副本,所以修改其中一个 也会自动影响其他列表。:

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

1
投票

问题是这一行:

mat = [[0]*5]*5

它的作用是创建一个包含 5 个零的列表 (

[0]*5
),然后再创建 5 个对该同一个列表的引用。

解决这个问题的解决方案:

mat = [[0]*5 for _ in xrange(5)]

这会创建一个包含 5 个零的列表 5 次,这意味着所有列表都是独立的。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.