Sont Python Listes muable?
Quand j'type de code suivant,
x=[1,2,4]
print(x)
print("x",id(x))
x=[2,5,3]
print(x)
print("x",id(x))
il donne de la sortie comme
[1, 2, 4]
x 47606160
[2, 5, 3]
x 47578768
Si les listes sont mutables alors pourquoi il donner 2 adresses mémoire lors de la modification de la liste des x?
- La réponse de @iCodez est sur place. Vous devez lire attentivement les "Nommage et de Liaison" de la section le Python docs, qui explique exactement ce qui se passe quand Python exécute une instruction d'affectation,
variable_name = ...
InformationsquelleAutor amandi | 2014-06-18
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas de mutation (changement) de la liste de l'objet référencé par
x
avec cette ligne:Au lieu de cela, cette ligne crée un nouvelle liste d'objet et puis affecte la variable
x
à elle. Donc,x
maintenant référence à l'objet nouveau etid(x)
donne un nombre différent qu'avant:x=2*x
crée un nouvel objet et se lie x au lieu de juste la mutation de l'objet d'origine. Similaire pourx.append
. Si j'écrisx.append
, puis l'adresse reste la même, mais si j'écrisx2=x.append
, alors x2 points à un nouvel objet. (Je ne peux pas écrirex=x.append
parce queappend()
ne pas renvoyer une nouvelle liste) je pense que j'ai besoin de comprendre pleinement la mission sémantique.Vous avez créé un nouvelle liste d'objet et liée à la même nom,
x
. Vous n'avez jamais muté de la liste existante de l'objet lié àx
au début.Noms en Python sont juste des références. L'affectation est de la liaison d'un nom à un objet. Lorsque vous affectez à
x
vous êtes à nouveau de souligner que la référence à un autre objet. Dans votre code, il vous suffit de créé un tout nouveau objet de la liste, puis rebondx
à ce nouvel objet.Si vous voulez muter une liste, appeler des méthodes sur l'objet:
ou de céder à des indices ou des tranches de la liste:
Démo:
Nous avons changé l'objet de la liste (muté), mais le
id()
de cette liste, l'objet n'a pas changé. C'est toujours la même liste d'objet.Peut-être cette excellente présentation par Ned Batchelder sur Python noms et de liaison peut aider: les Faits et les mythes à propos de Python noms et les valeurs.
Vous n'êtes pas la mutation de la liste, vous créez une nouvelle liste et l'affectation au nom
x
. C'est pourquoiid
est de vous donner les différentes sorties. Votre première liste est allé et sera le garbage collector (sauf si il y a une autre référence à quelque part).