Domanda

Ho inviato un riferimento a un oggetto bool, e ho modificato all'interno di un metodo. Dopo il metodo finito è esecuzione, il valore del bool fuori del metodo è rimasto invariato.

Questo mi porta a credere che Caccio di Python sono passati per valore. È vero? Quali altri tipi di Python si comportano in questo modo?

È stato utile?

Soluzione

variabili Python non sono "riferimenti" nel senso C ++. Piuttosto, essi sono semplicemente i nomi locali associati a un oggetto in qualche posizione arbitraria nella memoria. Se tale oggetto è di per sé mutevole, modifiche ad esso saranno visibili in altri ambiti che hanno legato un nome all'oggetto. Molti tipi primitivi (compresi bool, int, str e tuple) sono immutabile comunque. Non è possibile modificare il loro valore sul posto; piuttosto, si assegna un nuovo valore per lo stesso nome nel vostro ambito locale.

In realtà, quasi ogni momento * vedi codice del modulo foo = X, vuol dire che il nome foo viene assegnato un nuovo valore (X) all'interno del tuo spazio dei nomi locale corrente, non è che una locazione di memoria nominato da foo sta avendo il suo puntatore interno aggiornato per riferirsi invece alla posizione del X.

* -. L'unica eccezione a questo in Python è metodi setter per le proprietà, che possono permettere di scrivere obj.foo = X e lo hanno riscritto in background per chiamare invece un metodo come obj.setFoo(X)

Altri suggerimenti

Dipende se l'oggetto è mutevole o immutabile. oggetti immutabili si comportano come si è visto con il bool, mentre gli oggetti mutabili cambieranno.

Per riferimento: http://www.testingreflections.com/node/view/5126

  

Python passa riferimenti a oggetti di valore (come Java), e tutto in Python è un oggetto. Sembra semplice, ma poi si noterà che alcuni tipi di dati sembrano mostrare pass-by-value caratteristiche, mentre altri sembrano agire come pass-by-di riferimento ... Qual è il problema?

     

E 'importante capire oggetti mutabili e immutabili. Alcuni oggetti, come le stringhe, tuple e numeri, sono immutabili. alterarli all'interno di una funzione / metodo creerà una nuova istanza e l'istanza originale di fuori della funzione / metodo non è cambiato. Altri oggetti, come le liste e dizionari sono mutabili, il che significa che è possibile modificare l'oggetto sul posto. Pertanto, alterare un oggetto all'interno di una funzione / metodo cambierà anche l'oggetto originale fuori.

La cosa da ricordare è che non v'è non modo in Python per una funzione o di un metodo per associare nuovamente un nome nello spazio dei nomi di chiamata. Quando si scrive "Ho mandato un riferimento a un oggetto bool, e ho modificato all'interno di un metodo", quello che in realtà ha fatto (sto indovinando) è stato quello di associare nuovamente il nome del parametro (per cui il valore bool era vincolato dalla chiamata) all'interno il corpo del metodo.

In breve, non ci sono variabili in Python ; ci sono oggetti (come vero e falso, i Caccio capita di essere immutabili), e nomi. I nomi sono quello che voi chiamate variabili, ma i nomi appartengono a un ambito, non si può normalmente modificare i nomi diversi dai nomi locali.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top