Python инициализирует список списков

Возможный дубликат:
Приложение для добавления списка Python

Я намерен инициализировать список списка длиной n.

x = [[]] * n

Однако это как-то связывает списки вместе.

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

Я ожидаю иметь что-то вроде:

[[], [0], []]

Любые идеи?

Ответ 1

Проблема в том, что они все одинаковые точные списки в памяти. Когда вы используете синтаксис [x]*n, вы получаете список объектов n many x, но все они ссылаются на один и тот же объект. Это не разные экземпляры, а просто ссылки n на один и тот же экземпляр.

Чтобы составить список из трех разных списков, сделайте следующее:

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

Это дает вам 3 отдельных экземпляра [], которые вы хотите

[[]]*n похож на

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

Пока [[] for 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() 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