我打算初始化一个长度为n的list of list。

x = [[]] * n

然而,这以某种方式将列表链接在一起。

>>> x = [[]] * 3
>>> x[1].append(0)
>>> x
[[0], [0], [0]]

我希望有这样的东西:

[[], [0], []]

什么好主意吗?


当前回答

问题是它们在内存中都是相同的列表。当您使用[x]*n语法时,您得到的是一个包含n个x个对象的列表,但它们都是对同一个对象的引用。它们不是不同的实例,而是对同一个实例的n个引用。

要列出3个不同的列表,可以这样做:

x = [[] for i in range(3)]

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

[[]]*n与

l = []
x = []
for i in range(n):
    x.append(l)

而对于i in range(3)],[[]类似于:

x = []
for i in range(n):
    x.append([])   # appending a new list!

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

其他回答

问题是它们在内存中都是相同的列表。当您使用[x]*n语法时,您得到的是一个包含n个x个对象的列表,但它们都是对同一个对象的引用。它们不是不同的实例,而是对同一个实例的n个引用。

要列出3个不同的列表,可以这样做:

x = [[] for i in range(3)]

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

[[]]*n与

l = []
x = []
for i in range(n):
    x.append(l)

而对于i in range(3)],[[]类似于:

x = []
for i in range(n):
    x.append([])   # appending a new list!

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