2014-12-13 17 views
9
>>> a=1 
>>> b=1 
>>> id(a) 
140472563599848 
>>> id(b) 
140472563599848 
>>> x=() 
>>> y=() 
>>> id(x) 
4298207312 
>>> id(y) 
4298207312 
>>> x1=(1) 
>>> x2=(1) 
>>> id(x1) 
140472563599848 
>>> id(x2) 
140472563599848 

Bis zu diesem Punkt dachte ich, es wird nur eine Kopie des unveränderlichen Objekts geben, die von allen Variablen geteilt (gezeigt) wird.Interna für Python-Tupel

Aber als ich versuchte, die folgenden Schritte habe ich verstanden, dass ich falsch lag.

>>> x1=(1,5) 
>>> y1=(1,5) 
>>> id(x1) 
4299267248 
>>> id(y1) 
4299267320 

Kann mir bitte jemand die Interna erklären?

Antwort

9
>>> x1=(1) 
>>> x2=(1) 

ist eigentlich das gleiche wie

>>> x1=1 
>>> x2=1 

In Python smaller numbers are internally cached. Sie werden daher nicht mehrmals im Speicher erstellt. Deshalb sind id s von x1 und x2 die gleichen bis zu diesem Punkt.

Ein ein Element Tupel sollte am Ende ein Komma haben, wie diese

>>> x1=(1,) 
>>> x2=(1,) 

Wenn Sie dies tun, gibt es zwei neue Tupel mit nur einem Element darin gebaut werden. Obwohl die Elemente innerhalb der Tupel die gleichen sind, sind sie beide unterschiedliche Tupel. Deshalb haben sie beide unterschiedliche id s.

Nehmen wir Ihr letztes Beispiel und zerlegen Sie den Code. Jetzt

compiled_code = compile("x1 = (1, 5); y1 = (1, 5)", "string", "exec") 

,

import dis 
dis.dis(compiled_code) 

wäre so etwas wie dieses

1   0 LOAD_CONST    3 ((1, 5)) 
       3 STORE_NAME    0 (x1) 
       6 LOAD_CONST    4 ((1, 5)) 
       9 STORE_NAME    1 (y1) 
      12 LOAD_CONST    2 (None) 
      15 RETURN_VALUE 

Es lädt einen konstanten Wert, bezeichnet durch den Index 3, produzieren, die ist (1, 5) und speichert sie dann in x1. Auf die gleiche Weise lädt es einen anderen konstanten Wert bei Index 4 und speichert es in y1. Wenn wir uns die Liste der Konstanten im Code Objekt aussehen,

print(compiled_code.co_consts) 

geben

(1, 5, None, (1, 5), (1, 5)) 

Die Elemente an den Positionen 3 und 4 sind die Tupel, die wir in den eigentlichen Code erstellt. Daher erstellt Python nicht nur eine Instanz für jedes unveränderliche Objekt, immer. Es ist ein Implementierungsdetail, über das wir uns sowieso nicht viel Gedanken machen müssen.

Hinweis: Wenn Sie nur eine Instanz eines unveränderlichen Objekt haben, Sie können es manuell wie diese nun

x1 = (1, 5) 
x2 = x1 

, beide x2 und x1 das gleiche Tupel Objekt beziehen.

+1

Und der Weg, um * eine Kopie * zu haben, ist zu tun: 'x2 = x1' ... –

+1

@JonClements Enthalten, dass in der Antwort jetzt :-) – thefourtheye

Verwandte Themen