为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

杨__羊羊 2021-03-28 15:11:39
我正在使用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]]


查看完整回答
反对 回复 2021-04-02
  • 2 回答
  • 0 关注
  • 221 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号