ProgrammazioneSviluppatore Python Backend

Che cos'è la mutabilità (mutable/immutable) degli oggetti in Python? Come influisce sul lavoro delle funzioni e sulla trasmissione dei parametri? Fai degli esempi di errori tipici.

Supera i colloqui con l'assistente IA Hintsage

Risposta.

Mutabilità definisce se un oggetto può essere modificato senza cambiare il suo identificatore (indirizzo in memoria):

  • Oggetti mutabili (ad esempio, list, dict, set) possono essere modificati: aggiungere elementi, modificare o rimuovere.
  • Oggetti immutabili (ad esempio, int, str, tuple, frozenset) non possono essere modificati dopo la creazione: qualsiasi "modifica" crea un nuovo oggetto.

Impatto sulle funzioni:

  • Quando passi un oggetto mutabile a una funzione, essa può modificarlo.
  • Con oggetti immutabili non ci saranno modifiche, anche se "sostituiti" all'interno della funzione.

Esempio:

def f(lst): lst.append(42) data = [] f(data) print(data) # [42] def f2(x): x += 1 n = 1 f2(n) print(n) # 1

Domanda insidiosa.

"Cosa stamperà il seguente codice?"

def foo(bar=[]): bar.append(1) return bar print(foo()) print(foo())

Risposta: Produrrà:

[1]
[1, 1]

Perché gli argomenti della funzione vengono inizializzati una sola volta alla definizione, non ad ogni chiamata. Le liste (e altri oggetti mutabili) negli argomenti della funzione sono una trappola comune.

Esempi di errori reali a causa della mancanza di conoscenza delle sottigliezze dell'argomento.


Storia

Nell'API REST restituivano un elenco attraverso una funzione con un parametro predefinito:

def get_default_items(items=[]): items.append('x') return items

Dopo alcune chiamate, hanno scoperto che l'elenco cresceva, mentre ci si aspettava di ricevere solo un elemento.


Storia

Nella funzione si intendeva "sostituire" una stringa:

def replace_word(word): word.replace('a', 'b') word = 'data' replace_word(word) print(word) # Ci si aspettava 'dbtb', si è ottenuto 'data'

I metodi str non modificano la stringa originale, ma restituiscono una nuova, ma il valore del risultato restituito è stato ignorato.


Storia

Lavorando con strutture annidate:

original = [[1, 2], [3, 4]] copy = original[:] copy[0][0] = -1 print(original) # [[-1, 2], [3, 4]]

È stata utilizzata una copia superficiale, pensando di aver modificato solo la copia, ma gli oggetti annidati sono rimasti condivisi.