Question Python initialisant une liste de listes [dupliquer]


Duplication possible:
Comportement de la liste Python 

Je compte initialiser une liste de liste de longueur n.

x = [[]] * n

Cependant, cela lie en quelque sorte les listes ensemble.

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

Je m'attends à avoir quelque chose comme:

[[], [0], []]

Des idées?


106
2017-10-09 01:02


origine


Réponses:


Le problème est qu’ils sont tous dans la même liste exacte en mémoire. Lorsque vous utilisez le [x]*n la syntaxe, ce que vous obtenez est une liste de n beaucoup x objets, mais ils sont tous des références au même objet. Ils ne sont pas des cas distincts, mais plutôt 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 [], c'est ce que tu veux

[[]]*n est similaire à

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

Tandis que [[] 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

180
2017-10-09 01:03