Exemple simple: impression p> tandis que: p> Imprimés P> [1, 2, 3, 4, 5]
[2, 3, 4, 5, 6]
6 Réponses :
Dans le premier exemple, l'entier est copié dans Obj qui est augmenté de 1. La liste n'est pas modifiée. P>
Si vous utilisiez une instance de classe et effectueriez des opérations dessus, cela serait changé. P>
vous êtes confus. Considérez votre premier extrait: Pour être clair: il n'y a pas de copies dans cet exemple de code. Obj est une variable qui contient un objet dans la liste. C'est tout. P> p> obj code> n'est pas une sorte de pointeur magique dans la liste. C'est une variable qui contient une référence à un objet qui se trouve également dans la myiste.
obj + = 1 code> a pour effet d'augmenter la valeur stockée dans
obj code>. Votre code ne fait alors rien avec cette valeur. P>
Si obj code> serait un itérateur comme dans C ++, l'objet de la liste serait mis à jour. Mais apparemment,
obj code> est une copie et des modifications sont ignorées après chaque itération. Apparemment, Python fait ce dernier, qui est ma question.
@ROBW: Répétez après moi: il n'y a pas d'exemplaire dans cet exemple de code. obj code> est une variable qui contient un objet dans la liste. C'est tout.
La raison en général, il est est em> possible de modifier la liste tout en itération sur celui-ci en utilisant obj + = 1 code> ne fait pas ce qui vous attend est que cette instruction ne modifie pas
obj code> en place. Au lieu de cela, il calcule la nouvelle valeur et rebinds em> la variable
obj code> pour pointer sur la nouvelle valeur. Cela signifie que le contenu de la liste reste inchangé.
pour obj dans la myiste code>. Par exemple: P>
myList = [val+1 for val in myList]
Merci pour votre réponse. J'ai déjà conclu que le obj code> itérateur n'est pas un itérateur comme en C ++ et la modification de l'objet ne modifie pas la liste. Ce que vous dites, c'est que
obj code> est à nouveau lié au nouvel objet qui sera perdu dans la prochaine itération. Dégager!
Très bonne réponse! Il ne s'agit pas de «copie peu profonde» parlà par la réponse acceptée.
dans C'est pour obj dans myList: code>, dans chaque itération,
obj code> est une copie (peu profonde) de l'élément dans
myList code>. Donc, la modification du
obj code> ne fait rien à
myList code> S. p>
pour mon $ obj (@mylist) {} code> p> p>
Exactement, je comprends que maintenant. obj code> n'est pas un itérateur comme dans C ++, il s'agit essentiellement d'une copie de l'objet, qui est ignorée dans la prochaine itération. Ainsi, la modification ne peut être effectuée qu'avec l'accès global / direct de la liste.
@ROBW, obj code> n'est pas une copie et cette réponse est trompeuse. Obj - comme toutes les variables de Python - ressemble davantage à un pointeur en C / C ++. Voir la modification à Ma réponse .
Ade Yu, je rassemble lorsque vous dites "Copier" Vous voulez dire "copie de l'adresse de l'élément" plutôt que "copie de l'élément lui-même". Vous pourriez clarifier cela.
@senderle Oui. Dans Python, variables i> ne sont que des références à objets i>. Seules les variables i> sont copiées, mais les objets i>. C'est juste comme obj = myList [index] code> est arrivé au tout début de chaque itération. Donc,
obj + = 1 code> n'affecte pas le
myList [index] code>. Merci. Je vais améliorer ma déclaration de réponse.
pourrait ne pas être une copie peu profonde s'il s'agit d'une liste de listes
La modification de la liste est autorisée. Vos exemples de code Arbove sont assez brassés ...
myList = [1, 2, 3, 4, 5] for index in range(0,len(myList)): myList[index] += 1 print myList
C'est vraiment ce que j'ai posté et ne répond rien.
Je pense que vous avez mal compris quel est un "objet itérateur". Un pour code> boucle n'est pas un objet Itérateur. À toutes fins utiles, a une boucle comme celle-ci:
for i, x in enumerate(myList):
myList[i] = some_func(x)
Évidemment, Imprimer A CODE> doit être
Imprimer MyList CODE>, j'ai réparé cela. Merci pour le pointeur de
énumérable code>, très utile, évite de maintenir votre propre code pour l'index de la liste!
Être encore plus pythonique et concis, vous pouvez faire soit soit [quelque_func (x) pour x dans myMist] code> ou
carte (quelque_func, myList) code>, bien que ceux-ci font des copies de la liste initiale.
Comme, ce code produirait un
NameError code> car
a code> n'est pas défini.
Vos exemples de code sont mauvais. D'où viennent les premiers à imprimer? Votre impression 'A' qui n'existe pas et il y a deux sorties.
quelque peu liée
Désolé gars, "A" devrait évidemment être "myList". Fixé dans le poteau.