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?
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