>>> 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.
Und der Weg, um * eine Kopie * zu haben, ist zu tun: 'x2 = x1' ... –
@JonClements Enthalten, dass in der Antwort jetzt :-) – thefourtheye