【问题标题】:Python: Why randint on a matrix keeps giving me the same rows [duplicate]Python:为什么矩阵上的randint一直给我相同的行[重复]
【发布时间】:2013-06-13 14:11:02
【问题描述】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      问题出在这一行:

      mat = [[0]*5]*5
      

      这样做是创建一个包含 5 个零的列表 ([0]*5),然后再创建 5 个对该相同列表的引用。

      解决这个问题的方法:

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

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

      【讨论】:

      • 谢谢你,它成功了!
      猜你喜欢
      • 2016-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-26
      • 2021-09-05
      • 2014-01-30
      相关资源
      最近更新 更多