10
votes

Extension d'une liste de listes dans Python?

Je serais peut-être manquant quelque chose sur le comportement prévu de la liste étendue, mais pourquoi ce qui suit se produit-il?

x = [[],[]]
y = [[]] * 2

print x       # [[],[]]
print y       # [[],[]]
print x == y  # True

x[0].extend([1])
y[0].extend([1])

print x    # [[1],[]], which is what I'd expect
print y    # [[1],[1]], wtf?


1 commentaires

Je suis au courant de ce que l'annexe fait, je venais d'aborder un exemple de contrepartie pour la question de la question.


3 Réponses :


4
votes

L'énoncé y = [[]] * 2 liets y à une liste contenant 2 copies de la même liste. Utilisation: xxx

ou xxx


2 commentaires

Techniquement, il s'agit de deux références à la même liste, pas de copies.


tu veux dire, "2 références" au lieu de "2 copies", non? J'ai suggéré que comme une édition



1
votes

y contient deux références à une liste unique, mutable,.


0 commentaires

17
votes

Dans le cas de [quelque chose] * 2 code>, Python fait simplement une copie de référence. Par conséquent, si le (s) type (s) ci-joint (s) est mutable, la modification de celle-ci sera réfléchie n'importe où l'élément est référencé.

dans votre exemple, y [0] code> et y [1] Pointez sur le même objet de liste ci-joint. Vous pouvez vérifier cela en faisant y [0] est Y [1] code> ou alternativement id (y [0]) == ID (y [1]) code>. p>

Vous pouvez toutefois ré-attribuer des éléments de liste, donc si vous aviez fait: p> xxx pré>

vous auriez re-lié le premier élément à une nouvelle liste contenant L'élément "1", et vous auriez obtenu votre résultat attendu. p>

conteneurs dans les références de stockage Python, et il est possible dans la plupart des conteneurs de séquence de référencer le même article plusieurs fois. Une liste peut réellement se réfuser en tant qu'élément, bien que l'utilité de ceci est limitée. P>

Ce problème n'aurait pas été mis en place si vous aviez multiplié une liste contenant des types immuables: P>

a = [0, 1] * 2


0 commentaires