1
votes

J'ai utilisé append () dans une boucle et pour une raison quelconque, la liste change à chaque fois pas comme elle le devrait

J'ai écrit ce code:

[]
[]
[[]]
[0]
[[0]]
[[0], [0]]
[0, 1]
[[0, 1], [0, 1]]
[[0, 1], [0, 1], [0, 1]]

Je m'attendais à ce qu'il soit imprimé:

[]
[]
[[]]
[0]
[[]]
[[],0]
[0,1]
[[],0]
[[],0,[0,1]]

Mais à la place, il a imprimé:

XXX

Je ne comprends pas pourquoi lst change ses membres en actuels.


0 commentaires

3 Réponses :


3
votes

au lieu de cette ligne lst.append (current) , allez avec ceci:

from copy import copy

lst.append(copy(current))

Ce problème est que lorsque vous ajoutez current code > au lst ça a l'air bien, mais dans l'itération suivante lorsque vous changez de courant et l'ajoutez à nouveau, cela changera le courant précédent que vous avez déjà ajouté. c'est pourquoi vous voyez deux [0] et trois [0, 1]

jetez un œil à Ce lien pour plus de précisions.

À lire également Ce lien aura des effets positifs sur ce qu'est la copie et les types de copies.


0 commentaires

0
votes

sauf si vous effectuez une copie ou copie profonde , chaque élément de lst pointera sur current < pre> XXX

affichera le résultat souhaité


0 commentaires

0
votes

Copie superficielle

Une copie superficielle construit un nouvel objet composé puis (au dans la mesure du possible) y insère des références aux objets trouvés dans l'original.

lst.append (current [:]) # shallow-copy

fonctionne à la fois en Python 2 et 3.

lst = []
current= []
for i in range(3):
    print(current)
    print(lst)
    lst.append(current[:]) # shallow-copy
    print(lst)
    current.append(i)

0 commentaires