【发布时间】:2012-10-29 07:09:16
【问题描述】:
在解决一个关于二维数组的简单问题时,我在这个网站上遇到了一个解决方案,它解释了如何使用重载运算符在 Python 中声明一个。
例子:
Myarray = [[0]*3]*3
这将产生以下数组(列表)
[[0,0,0],[0,0,0],[0,0,0]]
在您使用它之前,这似乎很好:
如果你分配一个元素,例如:
Myarray [0][0] = 1
你得到了意想不到的输出:
[[1,0, 0],[1,0,0] , [1,0,0]]
实际上同时分配 Myarray[1][0] 和 Myarray[2][0]
我的解决方案:
Myarray = [[][][]]
for i in range(0,3):
for j in range (0,3):
Myarray[i].append(0)
此解决方案按预期工作:
Marray[0][1] = 1
给你
[[1,0, 0],[0,0,0] , [0,0,0]]
有没有更简单的方法可以做到这一点?这是剑桥 A 级问题的解决方案,与其他语言相比,对于学生来说似乎过于冗长。
【问题讨论】:
-
当您执行
Myarray = [[0]*3]*3时,实际上是在乘以引用。列表理解是一种单行方式。 -
用其他语言会短多少?
-
我喜欢
[x[:] for x in [[0]*3]*3]用于非 numpy 二维数组,但我在那个方面是少数。 -
@ScottHunter:有一些类似 Python 的语言是只是
[[0]*3]*3,因为它们没有正确地引用。当然留在 Python 中,假设你已经完成了from numpy import *:zeros((3,3))实际上更短,也更好。
标签: python