let il code> soit un élément itérable de Python.
Dans quels cas une modification de il code> à l'intérieur d'une boucle sur il code> reflété? Ou plus simple: quand quelque chose comme ce travail? it = range(6)
for i in it:
it = it.remove(i+1)
print it
3 Réponses :
Lorsque vous ithétiez sur une liste code>, vous appelez réellement list .__ iTer __ () code>, qui renvoie un objet code> lisiterator code> objet lié au Liste code>, puis réellement itérer sur ce lisiteratorator code>. Techniquement, ceci: # creates a `list` and binds it to name "a"
a = [1, 2, 3]
# get the object bound to name "a" and binds it to name "b" too.
# at this point "a" and "b" both refer to the same `list` instance
b = a
print id(a), id(b)
print a is b
# so if we mutate "a" - actually "mutate the object bound to name 'a'" -
# we can see the effect using any name refering to this object:
a.append(42)
print b
# now we rebind "a" - make it refer to another object
a = ["a", "b", "c"]
# at this point, "b" still refer to the first list, and
# "a" refers to the new ["a", "b", "c"] list
print id(a), id(b)
print a is b
# and of course if we now mutate "a", it won't reflect on "b"
a.pop()
print a
print b
Pouvez-vous développer un peu plus? Y a-t-il d'autres objets, où c'est le même cas?
@Dschoni dépend de ce que vous entendez par "le même cas" ... WRT / La partie "Muting VS Rebinding", c'est à quel point les œuvres Python - "Variables" ne sont pas des "godets de mémoire", ne font que référencer des objets. Si vous voulez en savoir plus sur le protocole Itérateur, il est entièrement documenté dans Finemanual de Python, mais vous pouvez obtenir une intro et plus de références ici: Stackoverflow.com/questions/9884132/...
Dans la première boucle, vous modifiez le Jetons un coup d'oeil sur le bytecode généré: p> comme vous pouvez le voir, IT CODE> objet (état intérieur de l'objet), cependant, dans la seconde boucle, vous réaffectez le IT code> à un autre objet, laissant un objet initial inchangé. pour code> instruction fonctionne avec un iérêteur de il code> ( get_iter code> instruction, iter (it) code>). Par conséquent, la réaffectation de la variable code> code> n'affectera pas l'itération de la boucle. P> p>
Vous avez mon uppote pour l'utilisation de DIS code> parce que je n'ai jamais vu cela avant et ça a l'air incroyablement génial. Je vais inspecter mon cas de certification moi-même.
C'est pourquoi j'aime Python - il offre beaucoup de choses étonnantes hors de la boîte
Premièrement, il est essentiel de comprendre ce qui se passe sous la hotte lorsque vous exécutez une simple boucle, comme: au début de la boucle, un itérateur < / em> est créé. Cet itérateur est le résultat d'un appel implicite à Qu'est-ce que cela signifie pour votre deuxième exemple? p> Notez que dans votre deuxième exemple, vous ne modifiez pas la liste sur place, mais créez une nouvelle liste et lier la variable Cela signifie que l'itérateur continue à référencer la liste d'origine, qui est inchangée. p> Dans votre premier exemple, vous modifiez la liste d'origine en place, car Appels vers iter (it) code>. Ceci est le seul em> la variable nommée IT code> est référencé dans la boucle ci-dessus. Le reste des références se produisent lorsque Suivant code> est appelé sur cet itérateur, mais il utilise l'objet que l'itérateur conserve une référence à la référence, et non à l'objet le nom IT code> est lié. P> il code> à celui-ci. p> Suivant (Itérateur) CODE> reflète ces modifications. P> P>
Dans le deuxième exemple, vous êtes pas b> Changer tout iTérable (et non ibler, non plus, comme ce n'est pas une chose).
Pour référence: Stackoverflow.com/questions/9884132/...