Se arrivate a Python da una lingua in C / Java / ecc. famiglia, può aiutarti a smettere di pensare acome una "variabile" e iniziare a pensarla come un "nome".
a, be cnon sono variabili diverse con valori uguali; sono nomi diversi per lo stesso valore identico. Le variabili hanno tipi, identità, indirizzi e tutti i tipi di cose del genere.
I nomi non hanno nulla di tutto ciò. I valori sì, ovviamente, e puoi avere molti nomi per lo stesso valore.
Se dai Notorious B.I.G.un hot dog, * Biggie Smallse Chris Wallacehai un hot dog. Se si modifica il primo elemento di ain 1, i primi elementi di be csono 1.
Se vuoi sapere se due nomi stanno nominando lo stesso oggetto, usa l' isoperatore:
>>> a=b=c=[0,3,5]
>>> a is b
True
Quindi chiedi:
cosa è diverso da questo?
d=e=f=3
e=4
print('f:',f)
print('e:',e)
Qui, stai ricollegando il nome eal valore 4. Ciò non influisce sui nomi de fin alcun modo.
Nella versione precedente, stavi assegnando a a[0], non a a. Quindi, dal punto di vista di a[0], stai ribaltando a[0], ma dal punto di vista di a, lo stai cambiando sul posto.
Puoi usare la idfunzione, che ti dà un numero univoco che rappresenta l'identità di un oggetto, per vedere esattamente quale oggetto è anche quando isnon può aiutarti:
>>> 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
Si noti che a[0]è stato modificato da 4297261120 a 4297261216, ora è un nome per un valore diverso. Ed b[0]ora è anche un nome per lo stesso nuovo valore. Questo perché ae bstanno ancora nominando lo stesso oggetto.
Sotto le copertine, in a[0]=1realtà sta chiamando un metodo sull'oggetto elenco. (È equivalente a a.__setitem__(0, 1).) Quindi, in realtà non sta affatto ribaltando nulla. È come chiamare my_object.set_something(1). Certo, probabilmente l'oggetto sta vincolando un attributo di istanza per implementare questo metodo, ma non è questo ciò che è importante; l'importante è che non stai assegnando nulla, stai solo mutando l'oggetto. Ed è lo stesso con a[0]=1.
user570826 ha chiesto:
E se avessimo a = b = c = 10
È esattamente la stessa situazione di a = b = c = [1, 2, 3]: hai tre nomi per lo stesso valore.
Ma in questo caso, il valore è an inte ints sono immutabili. In entrambi i casi, puoi ricollegare aa un valore diverso (ad esempio, a = "Now I'm a string!"), ma ciò non influirà sul valore originale, per il quale be csaranno comunque nomi. La differenza è che con un elenco, è possibile modificare il valore [1, 2, 3]in [1, 2, 3, 4]facendo, ad esempio, a.append(4); dal momento che questo sta effettivamente cambiando il valore per cui be csono nomi, bora b [1, 2, 3, 4]. Non c'è modo di cambiare il valore 10in nient'altro. 10ha 10 anni per sempre, proprio come Claudia il vampiro ne ha 5 per sempre (almeno fino a quando non viene sostituita da Kirsten Dunst).
* Avvertenza: non dare a Notorious BIG un hot dog. Gli zombi rap Gangsta non dovrebbero mai essere nutriti dopo mezzanotte.
a,bec,per tutti i punti sullo stesso valore (in questo caso una lista), o vuoia=0,b=3ec=5. In tal caso, vuoia,b,c = [0,3,5]o semplicementea,b,c = 0,3,5.