Pour simuler le fonctionnement interne de l'itération de listes, réécrivons votre programme en utilisant des indices entiers et un fichier de type while
boucle.
lst = ["Mohit", "kumar", "sffsfshfsd"]
pos = 0
while pos < len(lst):
word = lst[pos]
print('lst=%s pos=%d word=%s' % (lst, pos, word))
if len(word) > 5:
lst.insert(0, word)
pos += 1
Ce qui suit montre ce qui se passe lorsque vous exécutez cette opération :
lst=['Mohit', 'kumar', 'sffsfshfsd'] pos=0 word=Mohit
lst=['Mohit', 'kumar', 'sffsfshfsd'] pos=1 word=kumar
lst=['Mohit', 'kumar', 'sffsfshfsd'] pos=2 word=sffsfshfsd
lst=['sffsfshfsd', 'Mohit', 'kumar', 'sffsfshfsd'] pos=3 word=sffsfshfsd
lst=['sffsfshfsd', 'sffsfshfsd', 'Mohit', 'kumar', 'sffsfshfsd'] pos=4 word=sffsfshfsd
lst=['sffsfshfsd', 'sffsfshfsd', 'sffsfshfsd', 'Mohit', 'kumar', 'sffsfshfsd'] pos=5 word=sffsfshfsd
lst=['sffsfshfsd', 'sffsfshfsd', 'sffsfshfsd', 'sffsfshfsd', 'Mohit', 'kumar', 'sffsfshfsd'] pos=6 word=sffsfshfsd
lst=['sffsfshfsd', 'sffsfshfsd', 'sffsfshfsd', 'sffsfshfsd', 'sffsfshfsd', 'Mohit', 'kumar', 'sffsfshfsd'] pos=7 word=sffsfshfsd
lst=['sffsfshfsd', 'sffsfshfsd', 'sffsfshfsd', 'sffsfshfsd', 'sffsfshfsd', 'sffsfshfsd', 'Mohit', 'kumar', 'sffsfshfsd'] pos=8 word=sffsfshfsd
lst=['sffsfshfsd', 'sffsfshfsd', 'sffsfshfsd', 'sffsfshfsd', 'sffsfshfsd', 'sffsfshfsd', 'sffsfshfsd', 'Mohit', 'kumar', 'sffsfshfsd'] pos=9 word=sffsfshfsd
...
(Cela continue jusqu'à ce que vous soyez à court de RAM ou de patience).
Comme vous pouvez le voir, vous continuez à décaler la finale 'sffsfshfsd'
à droite, de sorte que votre code continue à le regarder et ne s'arrête jamais.
Cela ne se produit pas si vous travaillez sur une copie puisque vous ne modifiez plus la liste sur laquelle vous itérez.
Cela ne se produirait pas non plus si vous deviez ajuster l'index de la boucle après l'insertion :
if len(word) > 5:
lst.insert(0, word)
pos += 1 # account for the extra word
pos += 1
ou déplacer le mot au lieu de le copier :
if len(word) > 5:
lst.insert(0, lst.pop(pos)) # don't change len(lst)