Si vous arrivez à Python en venant d'un langage de la famille C/Java/etc., il peut être utile d'arrêter de penser à a
comme une "variable", et commencez à y penser comme un "nom".
a
, b
et c
ne sont pas des variables différentes avec des valeurs égales ; ce sont des noms différents pour la même valeur identique. Les variables ont des types, des identités, des adresses, et toutes sortes de choses comme ça.
Les noms n'ont rien de tout cela. Valeurs bien sûr, et vous pouvez avoir beaucoup de noms pour la même valeur.
Si vous donnez Notorious B.I.G.
un hot dog, * Biggie Smalls
y Chris Wallace
prendre un hot dog. Si vous changez le premier élément de a
à 1, les premiers éléments de b
y c
sont 1.
Si vous voulez savoir si deux noms désignent le même objet, utilisez la fonction is
opérateur :
>>> a=b=c=[0,3,5]
>>> a is b
True
Vous demandez alors :
qu'est-ce qui est différent de cela ?
d=e=f=3
e=4
print('f:',f)
print('e:',e)
Ici, vous rebranchez le nom e
à la valeur 4
. Cela n'affecte pas les noms d
y f
de quelque manière que ce soit.
Dans votre version précédente, vous attribuiez aux a[0]
et non à a
. Donc, du point de vue de a[0]
vous êtes en train de rebrancher a[0]
mais du point de vue de a
vous le modifiez sur place.
Vous pouvez utiliser le id
qui vous donne un numéro unique représentant l'identité d'un objet, afin de savoir exactement quel objet est le bon, même en cas d'utilisation de la fonction is
ne peut pas aider :
>>> a=b=c=[0,3,5]
>>> id(a)
4473392520
>>> id(b)
4473392520
>>> id(a[0])
4297261120
>>> id(b[0])
4297261120
>>> a[0] = 1
>>> id(a)
4473392520
>>> id(b)
4473392520
>>> id(a[0])
4297261216
>>> id(b[0])
4297261216
Remarquez que a[0]
est passé de 4297261120 à 4297261216 - c'est maintenant un nom pour une valeur différente. Et b[0]
est aussi maintenant un nom pour cette même nouvelle valeur. C'est parce que a
y b
nomment toujours le même objet.
Sous les couvertures, a[0]=1
appelle en fait une méthode sur l'objet liste. (C'est l'équivalent de a.__setitem__(0, 1)
.) Donc, ce n'est pas vraiment de relier quoi que ce soit. C'est comme appeler my_object.set_something(1)
. Bien sûr, il est probable que l'objet lie à nouveau un attribut d'instance afin d'implémenter cette méthode, mais ce n'est pas ce qui est important ; ce qui est important, c'est que vous n'assignez rien, vous ne faites que muter l'objet. Et c'est la même chose avec a[0]=1
.
user570826 a demandé :
Et si nous avions, a = b = c = 10
C'est exactement la même situation que a = b = c = [1, 2, 3]
: vous avez trois noms pour la même valeur.
Mais dans ce cas, la valeur est un int
et int
sont immuables. Dans les deux cas, vous pouvez lier à nouveau a
à une valeur différente (par exemple, a = "Now I'm a string!"
), mais cela n'affectera pas la valeur d'origine, qui est la suivante b
y c
seront toujours des noms pour. La différence est qu'avec une liste, vous pouvez modifier la valeur [1, 2, 3]
en [1, 2, 3, 4]
en faisant, par exemple, a.append(4)
puisque c'est en fait changer la valeur que b
y c
sont des noms pour, b
sera désormais b [1, 2, 3, 4]
. Il n'y a aucun moyen de changer la valeur 10
en quoi que ce soit d'autre. 10
est 10 pour toujours, tout comme Claudia le vampire est 5 pour toujours (au moins jusqu'à ce qu'elle soit remplacée par Kirsten Dunst).
* Avertissement : Ne donnez pas de hot-dog à Notorious B.I.G.. Les zombies du gangsta rap ne doivent jamais être nourris après minuit.