ProgrammazioneSviluppatore Backend

Come funziona il meccanismo di passaggio dei parametri in Python (call by object reference / call by sharing)? Come influisce sui tipi mutabili e immutabili e come evitare modifiche inaspettate?

Supera i colloqui con l'assistente IA Hintsage

Risposta.

In Python, i parametri vengono passati secondo il principio 'call by object reference' (o 'call by sharing'). Ciò significa che la funzione riceve un riferimento all'oggetto, non l'oggetto stesso. Se l'oggetto è mutabile (mutable), all'interno della funzione è possibile modificare il suo contenuto e le modifiche si rifletteranno nella variabile esterna. Per gli oggetti immutabili (immutable), come numeri o stringhe, la modifica all'interno della funzione crea un nuovo oggetto, senza influenzare quello originale.

Esempio per un oggetto mutabile:

def add_value(lst): lst.append(42) nums = [1, 2, 3] add_value(nums) print(nums) # [1, 2, 3, 42]

Per un oggetto immutabile:

def add_value(num): num += 10 x = 5 add_value(x) print(x) # 5

Domanda trabocchetto.

Domanda: "Le variabili vengono passate in Python alle funzioni per riferimento o per valore?"

Risposta: Né l'uno né l'altro nel senso classico. La variabile passa effettivamente un riferimento all'oggetto, non la variabile stessa, e non è possibile sostituire l'oggetto per la variabile esterna.

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


Storia In uno dei progetti per il parsing dei dati, è stata utilizzata una funzione per filtrare la lista. Una nuova lista all'interno della funzione non veniva creata, il filtraggio avveniva attraverso le modifiche alla lista originale. Questo portava a cancellazioni dei dati originali: dopo alcune esecuzioni dello script, i dati non erano più presenti.


Storia Un junior developer credeva che le stringhe potessero essere modificate "per riferimento" all'interno della funzione, poiché altri parametri (liste) potevano essere modificati. Di conseguenza, dopo la chiamata della funzione, il programma non riceveva le modifiche attese (la stringa non era cambiata), causando bug inaspettati.


Storia In un'API REST, per filtrare i dati in entrata, lo sviluppatore ha dimenticato di fare una copia del dizionario dei parametri e, durante la validazione, i valori "scomparivano": i parametri venivano rimossi dall'oggetto originale, compromettendo la logica delle richieste successive.