se vieni a Python da una lingua in C/Java/etc. famiglia, potrebbe aiutarti a smettere di pensare a a
come a una "variabile" e iniziare a pensarlo come un "nome".
a
, b
e c
non sono variabili diverse con valori uguali; sono nomi diversi per lo stesso identico valore. Le variabili hanno tipi, identità, indirizzi e tutti i tipi di cose del genere.
I nomi non hanno nulla di tutto ciò. Valori fanno, ovviamente, e puoi avere molti nomi per lo stesso valore.
Se si dà Notorious B.I.G.
un hot dog, * Biggie Smalls
e Chris Wallace
avere un hot dog. Se si modifica il primo elemento di a
-1, i primi elementi di b
e c
sono 1.
Se vuoi sapere se due nomi sono nominare il medesimo oggetto, utilizzare l'operatore di is
:
>>> a=b=c=[0,3,5]
>>> a is b
True
è poi chiedere:
ciò che è diverso da questo?
d=e=f=3
e=4
print('f:',f)
print('e:',e)
Qui, si sta rebinding il nome e
al valore 4
. Ciò non ha alcun effetto sui nomi d
e f
in alcun modo.
Nella versione precedente, si assegnava a a[0]
, non a a
. Quindi, dal punto di vista di a[0]
, stai riconciliando a[0]
, ma dal punto di vista di a
, lo stai cambiando sul posto.
È possibile utilizzare la funzione id
, che vi dà qualche numero univoco che rappresenta l'identità di un oggetto, per vedere esattamente quale oggetto è che, anche quando non si può fare is
:
>>> 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
noti che a[0]
ha cambiato da 4297261120 a 4297261216-ora è un nome per un valore diverso. E b[0]
è ora anche un nome per quello stesso nuovo valore. Questo perché a
e b
stanno ancora denominando lo stesso oggetto.
Sotto le coperte, a[0]=1
è in realtà chiamare un metodo per l'oggetto lista. (È equivalente a a.__setitem__(0, 1)
.) Quindi, non è davvero ripetere nulla. È come chiamare my_object.set_something(1)
. Certo, probabilmente l'oggetto sta riconcordando un attributo di istanza per implementare questo metodo, ma questo non è ciò che è importante; l'importante è che non stai assegnando nulla, stai semplicemente mutando l'oggetto. Ed è lo stesso con a[0]=1
.
user570826 chiesto:
Che cosa succede se abbiamo, a = b = c = 10
che è esattamente la stessa situazione a = b = c = [1, 2, 3]
: avete tre nomi per lo stesso valore.
Ma in questo caso, il valore è uno int
e int
s sono immutabili. In entrambi i casi, è possibile riassociare a
a un valore diverso (ad es., a = "Now I'm a string!"
), ma non influirà sul valore originale, per cui saranno ancora disponibili i nomi b
e c
. La differenza è che con un elenco è possibile modificare il valore [1, 2, 3]
in [1, 2, 3, 4]
facendo, ad es., a.append(4)
; Dal momento che in realtà sta cambiando il valore che sono b
e c
, b
sarà ora b [1, 2, 3, 4]
. Non c'è modo di cambiare il valore 10
in qualcos'altro. 10
è 10 per sempre, proprio come Claudia il vampiro ha 5 anni (almeno fino a quando non sarà sostituita da Kirsten Dunst).
* Avvertenza: non fornire B.I.G. un hot dog. Gli zombie Gangsta Rap non dovrebbero mai essere nutriti dopo la mezzanotte.
Vuoi 'a',' b' e 'c,' puntare tutti allo stesso valore (in questo caso una lista), o vuoi 'a = 0',' b = 3', e 'c = 5'. In tal caso, vuoi 'a, b, c = [0,3,5]' o solo 'a, b, c = 0,3,5'. – chepner