python中没有数组类型,但为了模拟它,我们可以使用列表。我想要用零填充二维类似数组的结构。我的问题是:这两个表达式有什么区别:
zeros = [[0 for i in xrange(M)] for j in xrange(M)]
和
zeros = [[0]*M]*N
zeros
会是一样的吗?在速度和可读性方面,哪一个更好?
发布于 2012-10-31 20:29:53
您应该使用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个0的初始列表。
请注意:
zeros = [ [0]*M for _ in range(N) ] # Use xrange if you're still stuck in the python2.x dark ages :).
也会起作用,并且它避免了嵌套的列表理解。如果numpy
不在桌面上,这是我会使用的表单。
发布于 2016-08-20 09:48:07
对于Python 3(不再有xrange),首选答案
zeros = [ [0] * N for _ in range(M)]
对于M x N个零数组
发布于 2012-10-31 20:39:22
在第二种情况下,您创建了一个指向同一列表的引用列表。如果你有像这样的代码:
[lst] * N
其中lst
是对列表的引用,您将看到以下列表:
[lst, lst, lst, lst, ..., lst]
但由于结果列表包含对同一对象的引用,因此如果您更改一行中的值,则该值将在所有其他行中更改。
https://stackoverflow.com/questions/13157961
复制相似问题