2016-07-18 11 views
1

Nach dem Python-Tutorial, 9.2. Python-Bereiche und -Namespaces:Zuordnungen binden nur Namen an Objekte?

Zuweisungen kopieren keine Daten - sie binden nur Namen an Objekte.

Ich bin überrascht, so dass der folgende Code überrascht mich nicht:

>>> a = 42 
>>> b = a 
>>> b = b/2 
>>> a 
42 
>>> b 
21 

Wenn die Zuweisung b = a den Namen b zum int Objekt bindet nur 42, die bereits an a gebunden ist, sollte nicht a21 sein, wenn nach b = b/2 ausgeführt wird, seit a und b beziehen sich auf das gleiche Objekt?

+0

Nein, Sie haben ** Rebound ** diesen Namen. Ganzzahlen sind unveränderlich. Lesen Sie dies: http://nedbatchelder.com/text/names.html – jonrsharpe

+0

Objekte haben keine Namen - Namen haben Objekte. – erip

+0

@erip Sie meinen, ein Objekt kann viele verschiedene Namen haben, während ein Name nur auf ein Objekt verweisen kann? –

Antwort

3

Nun, Sie eine andere Zuordnung tun, um b:

b = b/2 

und da Operationen auf int (unveränderlich) Arten werden immer gibt ein neues Objekt zurück Es gibt keine Änderungen am ursprünglichen Wert was auch immer der Vorgang sein kann.

Diese für wandelbar Typen unterscheidet, die in bestimmte Operationen ändern kann, nämlich Augmented Zuordnung Operationen die Änderungen wurden an Ort und Stelle vorgenommen werden:

>>> a = [20] 
>>> b = a 
>>> b += [1] 
>>> b 
[20, 1] 
>>> a 
[20, 1] 

Hinweis, natürlich, dass dies nicht der Fall ist passieren mit einfachen Aufgaben waren, wie für int s der Name auf ein neues Objekt verweist:

>>> b = b + [1] 
>>> b 
[20, 1, 1] 
>>> a 
[20, 1] 
2

nach b = b/2, b ist neues Objekt

>>> a = 42 
>>> id(a) 
8006428 
>>> b = a 
>>> id(b) 
8006428 
>>> b = b/2 
>>> id(b) 
8006680 
0

Hier ist eine Spur davon:

>>> a = 42
a = 42
b undefiniert

>>> b = a
a = 42
b = a

>>> b = b/2
a = 42
b = 21

The Operation b = b/2 erstellt ein neues Objekt mit b, das zum Zeitpunkt a anzeigt. Es ändert sich nicht a, nur einen neuen Wert durch eine Operation erstellen, die a beteiligt. Jetzt bezieht sich b nicht mehr auf a, sondern auf einen neuen Wert, der mit a erstellt wurde.