Python инициализация списка списков [дубликат]




Возможные Дубликаты:
Python список добавить поведение






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



x = [[]] * n


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



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


Я ожидаю, что будет что-то вроде:



[[], [0], []]


какие идеи?

592   1  

1 ответ:

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

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

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

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

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

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()'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

Comments

    Ничего не найдено.