Python 列表理解创建矩阵时的冗余变量

Python 列表理解创建矩阵时的冗余变量,python,list-comprehension,Python,List Comprehension,我试图用零填充我的矩阵。不幸的是,在下面的示例中,变量x和y是冗余的: self.matrix = [[0 for x in range(0, self.N)] for y in range(0, self.N)] 乘法列表,仅复制引用当然不是我所期望的: >>> matrix = [[0] * 5] * 5 >>> matrix [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0,

我试图用零填充我的
矩阵。不幸的是,在下面的示例中,变量
x
y
是冗余的:

self.matrix = [[0 for x in range(0, self.N)] for y in range(0, self.N)]
乘法列表,仅复制引用当然不是我所期望的:

>>> matrix = [[0] * 5] * 5
>>> matrix
[[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]]
>>> matrix[1][1] = "X"
>>> matrix
[[0, 'X', 0, 0, 0], [0, 'X', 0, 0, 0], [0, 'X', 0, 0, 0], [0, 'X', 0, 0, 0], [0, 'X', 0, 0, 0]]

那么,是否有任何解决方案使用列表理解来避免冗余变量(
x
&
y
)?

常用的习惯用法是将结果分配给变量
\u
,这会向代码的可能读者发出信号,表示该值将不被使用:

[[0]*self.N for _ in range(self.N)]
如您所见,我们可以对内部列表使用
[0]*size
习惯用法,因为
0
是一个不可变的值。此外,您可以只使用一个参数调用
range
,在这种情况下,它被视为上限,0是下限)

如果需要,您可以自行构建一个列表构建帮助器,该帮助器支持创建任意嵌套深度的列表:

def make_multi_list(dim, func):
  if not dim: return func()
  return [make_multi_list(dim[1:], func) for _ in range(dim[0])]
用法:

>>> make_multi_list((2, 2), lambda: 0)
[[0, 0], [0, 0]]
>>> make_multi_list((3, 2, 1), lambda: 0)
[[[0], [0]], [[0], [0]], [[0], [0]]]

或者,您可以执行以下操作:

from itertools import repeat self.matrix = [list(repeat(0, self.N)) for _ in range(0, self.N)] 从itertools导入重复 self.matrix=[范围(0,self.N)内的u的列表(重复(0,self.N))]
谢谢,你说得对。我已经修正了密码。如果语言已经支持此功能,则不必使用repeat函数。@Ashwini:这有什么帮助?如果我没有错,那么他的问题是,当他向特定列表项添加值时,该值也会添加到名为matrix的列表中的其他列表中。并解释了列表的这种行为。@AshwiniChaudhary:他知道这种行为。问题是完全不同的,不过…谢谢,这就是我要找的!你给了我一个很好的例子。