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?
3 Réponses :
L'énoncé ou p> y = [[]] * 2 code> liets
y code> à une liste contenant 2 copies de la même liste. Utilisation:
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
y code> contient deux références à une liste unique, mutable,. p>
Dans le cas de dans votre exemple, Vous pouvez toutefois ré-attribuer des éléments de liste, donc si vous aviez fait: p> 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> [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é.
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>
a = [0, 1] * 2
Je suis au courant de ce que l'annexe fait, je venais d'aborder un exemple de contrepartie pour la question de la question.