>>> x1=(1)
>>> x2=(1)
è in realtà lo stesso
>>> x1=1
>>> x2=1
In Python, smaller numbers are internally cached. Quindi non verranno creati più volte nella memoria. Ecco perché id
s di x1
e x2
sono gli stessi fino a questo punto.
Un un elemento tupla dovrebbe avere una virgola alla fine, come questo
>>> x1=(1,)
>>> x2=(1,)
Quando si esegue questa operazione, ci sono due nuovi tuple essere costruite con un solo elemento in esso. Anche se gli elementi all'interno delle tuple sono uguali, entrambi sono diverse tuple. Questo è il motivo per cui entrambi hanno diversi id
s.
Consente di eseguire l'ultimo esempio e di disassemblare il codice.
compiled_code = compile("x1 = (1, 5); y1 = (1, 5)", "string", "exec")
Ora,
import dis
dis.dis(compiled_code)
produrrebbe qualcosa come questo
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
Si carica un valore costante, di cui dall'indice 3
, che è (1, 5)
e poi lo memorizza in x1
. Allo stesso modo, carica un altro valore costante, all'indice 4
e lo memorizza in y1
. Se guardiamo l'elenco delle costanti nel codice oggetto,
print(compiled_code.co_consts)
darà
(1, 5, None, (1, 5), (1, 5))
Gli elementi in posizioni 3
e 4
sono le tuple che abbiamo creato nel codice vero e proprio. Quindi, Python non crea solo un'istanza per ogni oggetto immutabile, sempre. È un dettaglio di implementazione di cui non dobbiamo preoccuparci molto.
Nota: Se si vuole avere una sola istanza di un oggetto immutabile, si può fare manualmente in questo modo
x1 = (1, 5)
x2 = x1
Ora, sia x2
e x1
farà riferimento allo stesso oggetto tupla.
E il modo per avere * una copia * è fare: 'x2 = x1' ... –
@JonClements Incluso nella risposta ora :-) – thefourtheye