Python初始化列表列表

Ami*_*mir 149 python list

可能重复:
Python列表追加行为

我打算初始化长度为n的列表.

x = [[]] * n
Run Code Online (Sandbox Code Playgroud)

但是,这会以某种方式将列表链接在一起.

>>> x = [[]] * 3
>>> x[1].append(0)
>>> x
[[0], [0], [0]]
Run Code Online (Sandbox Code Playgroud)

我希望有类似的东西:

[[], [0], []]
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

ins*_*get 254

问题是它们在内存中都是完全相同的列表.当您使用[x]*n语法时,您获得的是n许多x对象的列表,但它们都是对同一对象的引用.它们不是不同的实例,而只是n对同一实例的引用.

要列出3个不同的列表,请执行以下操作:

x = [[] for i in range(3)]
Run Code Online (Sandbox Code Playgroud)

这为您提供了3个单独的实例[],这就是您想要的

[[]]*n 类似于

l = []
x = []
for i in range(n):
    x.append(l)
Run Code Online (Sandbox Code Playgroud)

虽然[[] for i in range(3)]类似于:

x = []
for i in range(n):
    x.append([])   # appending a new list!
Run Code Online (Sandbox Code Playgroud)
In [20]: x = [[]] * 4

In [21]: [id(i) for i in x]
Out[21]: [164363948, 164363948, 164363948, 164363948] # same id()'s for each list,i.e same object


In [22]: x=[[] for i in range(4)]

In [23]: [id(i) for i in x]
Out[23]: [164382060, 164364140, 164363628, 164381292] #different id(), i.e unique objects this time
Run Code Online (Sandbox Code Playgroud)

  • 使用`_`代替`i`传递"'i'值未使用"检查. (7认同)
  • 我一直在为同样的问题苦苦挣扎,我的大脑几乎被吹走了。你的回答对我很有帮助。 (2认同)
  • 这不是一个错误,它只是一致的行为加上可变性的危险。当编写“[[]]*n”时,内部“[]”仅计算一次,而当编写“[[] for _ in range(n)]”时,内部“[]”计算“n”次。如果您编写“[1]*3”,编译器将使用对象“1”构造一个列表,然后连接该列表的三个副本。因为“1”是不可变的,所以当您编辑结果列表中的一项时,不会发生任何特殊情况。但是,如果将“1”替换为列表,则首先创建一个引用该列表的列表,然后连接该列表的 n 个副本。 (2认同)