Wenn Sie aus einer Sprache in C / Java / etc. Zu Python kommen. Familie, es kann Ihnen helfen, nicht mehr a
als "Variable" zu denken und es als "Namen" zu betrachten.
a
,, b
und c
sind keine unterschiedlichen Variablen mit gleichen Werten; Es sind verschiedene Namen für denselben identischen Wert. Variablen haben Typen, Identitäten, Adressen und dergleichen.
Namen haben nichts davon. Werte tun dies natürlich, und Sie können viele Namen für denselben Wert haben.
Wenn Sie Notorious B.I.G.
einen Hot Dog geben * Biggie Smalls
und Chris Wallace
einen Hot Dog haben. Wenn Sie das erste Element von a
in 1 ändern , sind die ersten Elemente von b
und c
1.
Wenn Sie wissen möchten, ob zwei Namen dasselbe Objekt benennen, verwenden Sie den is
Operator:
>>> a=b=c=[0,3,5]
>>> a is b
True
Sie fragen dann:
Was ist anders daran?
d=e=f=3
e=4
print('f:',f)
print('e:',e)
Hier binden Sie den Namen erneut e
an den Wert 4
. Das hat keinen Einfluss auf die Namen d
und f
in keiner Weise.
In Ihrer vorherigen Version haben Sie zugewiesen a[0]
, nicht zu a
. Aus der Sicht von a[0]
binden Sie also neu a[0]
, aber aus der Sicht von a
ändern Sie es an Ort und Stelle.
Sie können die id
Funktion verwenden, die Ihnen eine eindeutige Nummer gibt, die die Identität eines Objekts darstellt, um genau zu sehen, welches Objekt welches ist, auch wenn is
dies nicht helfen kann:
>>> 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
Beachten Sie, dass a[0]
sich dieser Wert von 4297261120 in 4297261216 geändert hat. Es handelt sich nun um einen Namen für einen anderen Wert. Und b[0]
ist jetzt auch ein Name für den gleichen neuen Wert. Das liegt daran a
und b
benennt immer noch dasselbe Objekt.
Unter dem Deckmantel a[0]=1
wird tatsächlich eine Methode für das Listenobjekt aufgerufen. (Es ist gleichbedeutend mit a.__setitem__(0, 1)
.) Es bindet also überhaupt nichts wirklich neu. Es ist wie ein Anruf my_object.set_something(1)
. Sicher, wahrscheinlich bindet das Objekt ein Instanzattribut neu, um diese Methode zu implementieren, aber das ist nicht wichtig. Wichtig ist, dass Sie nichts zuweisen, sondern nur das Objekt mutieren. Und so ist es auch mit a[0]=1
.
user570826 fragte:
Was ist, wenn wir haben, a = b = c = 10
Das ist genau die gleiche Situation wie a = b = c = [1, 2, 3]
: Sie haben drei Namen für den gleichen Wert.
In diesem Fall ist der Wert jedoch ein int
und int
s sind unveränderlich. In jedem Fall können Sie rebind a
auf einen anderen Wert (zB a = "Now I'm a string!"
), aber das wird nicht den ursprünglichen Wert beeinflussen, was b
und c
noch sein wird Namen. Der Unterschied besteht darin, dass Sie mit einer Liste den Wert [1, 2, 3]
in ändern können[1, 2, 3, 4]
indem zB a.append(4)
; da dies tatsächlich den Wert ändert, für den b
und c
Namen sind, b
wird nun b [1, 2, 3, 4]
. Es gibt keine Möglichkeit, den Wert 10
in etwas anderes zu ändern . 10
ist für immer 10, genau wie Claudia ist der Vampir für immer 5 (zumindest bis sie durch Kirsten Dunst ersetzt wird).
* Warnung: Geben Sie Notorious BIG keinen Hot Dog. Gangsta-Rap-Zombies sollten niemals nach Mitternacht gefüttert werden.
a
,b
undc,
an alle auf den gleichen Wert (in diesem Fall eine Liste), oder wollen Siea=0
,b=3
undc=5
. In diesem Fall möchten Siea,b,c = [0,3,5]
oder nura,b,c = 0,3,5
.