Supponiamo che tu ed io abbiamo un amico comune. Se decido che non mi piace più, è ancora tua amica. D'altra parte, se le faccio un regalo, il tuo amico ha ricevuto un regalo.
L'assegnazione non copia nulla in Python e "copia per riferimento" è da qualche parte tra scomodo e privo di significato (come in effetti fai notare in uno dei tuoi commenti). L'assegnazione fa sì che una variabile inizi a riferirsi a un valore. Non ci sono "tipi fondamentali" separati in Python; mentre alcuni di essi sono integrati, int
è ancora una classe.
In in entrambi i casi, l'assegnazione fa sì che la variabile faccia riferimento a qualunque sia la valutazione del lato destro. Il comportamento che stai vedendo è esattamente ciò che dovresti aspettarti in quell'ambiente, secondo la metafora. Se il tuo "amico" è uno int
o Klasa
, l'assegnazione a un attributo è fondamentalmente diversa dalla riassegnazione della variabile a un'istanza completamente diversa, con il comportamento corrispondentemente diverso.
L'unica vera differenza è che allo int
non sono assegnati attributi a cui è possibile assegnare. (Questa è la parte in cui l'implementazione deve effettivamente fare un po 'di magia per limitarti.)
Stai confondendo due concetti diversi di un "riferimento". Il C++ T&
è una cosa magica che, se assegnata a, aggiorna l'oggetto di riferimento sul posto e non il riferimento stesso; che non può mai essere "risistemato" una volta inizializzato il riferimento. Questo è utile in una lingua in cui la maggior parte delle cose sono valori. In Python, tutto è un riferimento all'inizio. Il riferimento Python è più simile a un puntatore sempre valido, mai nullo, non utilizzabile per l'aritmetica, automaticamente privo di riferimenti. L'assegnazione fa iniziare il riferimento facendo riferimento a una cosa completamente diversa. Non è possibile "aggiornare l'oggetto di riferimento sul posto" sostituendolo all'ingrosso, perché gli oggetti di Python non funzionano in questo modo. Puoi, naturalmente, aggiornare il suo stato interno giocando con i suoi attributi (se ce ne sono di accessibili), ma quegli attributi sono, loro stessi, anche tutti i riferimenti.
fonte
2011-12-11 16:50:13
Fuori linguaggio Python, i termini per riferimento/per valore sono già confusi e confusi. All'interno di Python, il cui modello di dati e il modello di esecuzione sono così speciali, questi termini sono ancora più confusi e confusi e dovrebbero essere evitati. Questa è la mia opinione, ma nota che non sono un esperto di Python. Vedi (http://stackoverflow.com/a/986145/551449) e molti altri post e blog su questo argomento. Sembra che sia necessario studiare un po 'di più i dati e i modelli di esecuzione di Python – eyquem