4 votes

Itération et mise à jour de la liste en python

Je n'arrive pas à comprendre pourquoi les éléments suivants indéfinie (alors que je n'utilise pas la liste de copie)

list = ["Mohit","kumar","sffsfshfsd"]
for w in list:
    if(len(w)) > 5:
        list.insert(0,w)
    print("inside loop")

print(list)  

Le code ci-dessus imprime boucle intérieure indéfiniment.

Maintenant, si à la place de la liste, j'utilise une liste de copie comme ci-dessous, cela fonctionne bien.

list = ["mohit","kumar","sffffgssddf"]

for w in list[:]:
    if len(w) > 5:
        list.insert(0,w)
    print("inside loop")

print(list)  

J'ai lu dans la documentation de python que c'est le comportement à adopter mais je veux comprendre la raison de ce comportement. Merci d'avance. l'avance.

1voto

White Points 452

Je pense que c'est une question très intéressante. Je pense que la réponse devrait se trouver dans l'implémentation du code source Python (désolé, je n'ai pas pu le trouver et j'espère que quelqu'un d'expert pourra nous diriger vers l'implémentation Python).

La boucle for ne créera pas de copie de vos données originales. Ainsi, chaque fois qu'une nouvelle donnée sera ajoutée, la boucle continuera. (Je ne suis pas sûr de la façon dont la boucle for est réalisée au niveau de l'implémentation, je crois qu'elle pourrait utiliser un itérateur).

d'autre part [ :], cet opérateur créera une nouvelle copie de l'ensemble de données original. Ainsi, quelle que soit la façon dont vous modifiez le jeu de données original, la boucle for boucle sur une copie (qui ne change pas).

La preuve est la suivante :

list = ["mohit","kumar","sffffgssddf"]
test = list
list.append("test")
print test 
#['mohit', 'kumar', 'sffffgssddf', 'test']

#clear data, let's try [:]
list = ["mohit","kumar","sffffgssddf"]
test = list[:]
list.append("test")
print test 
#['mohit', 'kumar', 'sffffgssddf']

Il est donc clair que dans votre deuxième exemple, votre boucle for boucle sur une copie des données originales. Ainsi, la modification de l'ensemble des données originales n'affectera pas la copie des données. Ainsi, votre deuxième exemple fonctionne et le premier exemple bouclera indéfiniment.

J'espère que cela vous aidera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X