python 中没有数组类型,但为了模拟它,我们可以使用列表。我想用零填充二维数组结构。我的问题是:这两个表达式有什么区别(如果有的话):
zeros = [[0 for i in xrange(M)] for j in xrange(M)]
和
zeros = [[0]*M]*N
会zeros
一样吗?通过速度和可读性,哪一个更好用?
python 中没有数组类型,但为了模拟它,我们可以使用列表。我想用零填充二维数组结构。我的问题是:这两个表达式有什么区别(如果有的话):
zeros = [[0 for i in xrange(M)] for j in xrange(M)]
和
zeros = [[0]*M]*N
会zeros
一样吗?通过速度和可读性,哪一个更好用?
你应该使用numpy.zeros
. 如果这不是一个选项,您需要第一个版本。在第二个版本中,如果您更改一个值,它将在列表中的其他位置更改 - 例如:
>>> a = [[0]*10]*10
>>> a
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
>>> a[0][0] = 1
>>> a
[[1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
这是因为(当您从内到外阅读表达式时),您创建了一个包含 10 个零的列表。然后,您创建一个包含 10 个对 10 个零的初始列表的引用的列表。
注意:
zeros = [ [0]*M for _ in range(N) ] # Use xrange if you're still stuck in the python2.x dark ages :).
也可以工作,它避免了嵌套列表理解。如果numpy
不在桌子上,这是我会使用的表格。
对于 Python 3(不再使用 xrange),首选答案
zeros = [ [0] * N for _ in range(M)]
对于 M x N 零数组
在第二种情况下,您创建一个对同一列表的引用列表。如果您有如下代码:
[lst] * N
其中lst
是对列表的引用,您将获得以下列表:
[lst, lst, lst, lst, ..., lst]
但是因为结果列表包含对同一对象的引用,所以如果您更改某一行中的值,它将在所有其他行中更改。
胡哲的回答比较安全,应该是最好的回答。这是因为如果我们使用接受的答案方法
a = [[0] * 2] * 2
a[0][0] = 1
print(a)
会给出答案
[[1,0],[1,0]]
因此,即使您只想更新第一行第一列的值,同一列中的所有值也会更新。然而
a = [[0] * 2 for _ in range(2)]
a[0][0] = 1
print(a)
给出正确答案
[[1,0],[0,0]]