web-dev-qa-db-fra.com

Python initialisation d'une liste de listes

Duplicate possible:
Le comportement de la liste en Python ajoute

J'ai l'intention d'initialiser une liste de liste d'une longueur de n.

x = [[]] * n

Cependant, cela lie d’une façon ou d’une autre les listes.

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

Je m'attends à quelque chose comme:

[[], [0], []]

Des idées?

138
Amir

Le problème est qu'ils sont tous exactement la même liste en mémoire. Lorsque vous utilisez la syntaxe [x]*n, vous obtenez une liste d'objets n nombreux x, mais ils font tous référence au même objet. Ce ne sont pas des instances distinctes, mais simplement n références à la même instance.

Pour faire une liste de 3 listes différentes, procédez comme suit:

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

Cela vous donne 3 instances distinctes de [], qui est ce que vous voulez

[[]]*n est similaire à

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

While [[] for i in range(3)] est similaire à:

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
238
inspectorG4dget