Si vous arrivez à Python à partir d'un langage du C / Java / etc. famille, cela peut vous aider à arrêter de penser à aune «variable» et à commencer à y penser comme un «nom».
a, bet cne 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 Smallset Chris Wallaceun hot-dog. Si vous remplacez le premier élément de apar 1, les premiers éléments de bet csont 1.
Si vous voulez savoir si deux noms nomment le même objet, utilisez l' isopé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 det fen 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 idfonction, qui vous donne un numéro unique représentant l'identité d'un objet, pour voir exactement quel objet est lequel même si iscela 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 aet bcontinuent de nommer le même objet.
Sous les couvertures, a[0]=1appelle 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 intet ints 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 bet csera 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 bet csont des noms, bva maintenant b [1, 2, 3, 4]. Il n'y a aucun moyen de changer la valeur 10en autre chose. 10a 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,betc,à tous les points à la même valeur (dans ce cas , une liste), ou voulez - vousa=0,b=3etc=5. Dans ce cas, vous vouleza,b,c = [0,3,5]ou tout simplementa,b,c = 0,3,5.