Si vous arrivez à Python à partir d'un langage du C / Java / etc. famille, cela peut vous aider à arrêter de penser à a
une «variable» et à commencer à 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. Les valeurs le font, bien sûr, et vous pouvez avoir beaucoup de noms pour la même valeur.
Si vous offrez Notorious B.I.G.
un hot-dog * Biggie Smalls
et Chris Wallace
un hot-dog. Si vous remplacez le premier élément de a
par 1, les premiers éléments de b
et c
sont 1.
Si vous voulez savoir si deux noms nomment le même objet, utilisez l' 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 reliez le nom e
à la valeur 4
. Cela ne touche pas les noms d
et f
en aucune façon.
Dans votre version précédente, vous attribuiez à a[0]
, pas à a
. Donc, du point de vue de a[0]
, vous reliez a[0]
, mais du point de vue de a
, vous le modifiez sur place.
Vous pouvez utiliser la id
fonction, qui vous donne un numéro unique représentant l'identité d'un objet, pour voir exactement quel objet est lequel même si is
cela 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
Notez que cela a[0]
est passé de 4297261120 à 4297261216 - c'est maintenant un nom pour une valeur différente. Et b[0]
est également maintenant un nom pour cette même nouvelle valeur. C'est parce que a
et b
continuent de nommer le même objet.
Sous les couvertures, a[0]=1
appelle en fait une méthode sur l'objet de liste. (C'est équivalent à a.__setitem__(0, 1)
.) Donc, ce n'est vraiment rien du tout. C'est comme appeler my_object.set_something(1)
. Bien sûr, l'objet est probablement en train de relier 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'attribuez rien, vous faites simplement muter l'objet. Et c'est la même chose avec a[0]=1
.
user570826 a demandé:
Et si nous avons, 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 an int
et int
s sont immuables. Dans les deux cas, vous pouvez associer a
à une valeur différente (par exemple a = "Now I'm a string!"
), mais n'affectera pas la valeur initiale, qui b
et c
sera toujours des noms pour. La différence est qu'avec une liste, vous pouvez changer la valeur [1, 2, 3]
en [1, 2, 3, 4]
faisant, par exemple a.append(4)
,; puisque cela change en fait la valeur pour laquelle b
et c
sont des noms, b
va maintenant b [1, 2, 3, 4]
. Il n'y a aucun moyen de changer la valeur 10
en autre chose. 10
a 10 pour toujours, tout comme Claudia la vampire a 5 pour toujours (du moins jusqu'à ce qu'elle soit remplacée par Kirsten Dunst).
* Attention: ne donnez pas à Notorious BIG un hot-dog. Les zombies de gangsta rap ne devraient jamais être nourris après minuit.
a
,b
etc,
à tous les points à la même valeur (dans ce cas , une liste), ou voulez - vousa=0
,b=3
etc=5
. Dans ce cas, vous vouleza,b,c = [0,3,5]
ou tout simplementa,b,c = 0,3,5
.