Python Language Mutevole e immutabile come argomenti


Esempio

Uno dei principali casi d'uso in cui uno sviluppatore deve prendere in considerazione la mutabilità è quando si passano gli argomenti a una funzione. Questo è molto importante, perché questo determinerà la possibilità per la funzione di modificare oggetti che non appartengono al suo scopo, o in altre parole se la funzione ha effetti collaterali. Questo è anche importante per capire dove deve essere reso disponibile il risultato di una funzione.

>>> def list_add3(lin):
    lin += [3]
    return lin

>>> a = [1, 2, 3]
>>> b = list_add3(a)
>>> b
[1, 2, 3, 3]
>>> a
[1, 2, 3, 3]

Qui, l'errore è pensare che lin , come parametro per la funzione, possa essere modificato localmente. Invece, lin e a riferimento lo stesso oggetto. Poiché questo oggetto è mutabile, la modifica viene eseguita sul posto, il che significa che l'oggetto a cui fa riferimento sia lin che a viene modificato. lin non ha davvero bisogno di essere restituito, perché abbiamo già un riferimento a questo oggetto sotto forma di a . a e b terminano con riferimento allo stesso oggetto.

Questo non è lo stesso per le tuple.

>>> def tuple_add3(tin):
    tin += (3,)
    return tin

>>> a = (1, 2, 3)
>>> b = tuple_add3(a)
>>> b
(1, 2, 3, 3)
>>> a
(1, 2, 3)

All'inizio della funzione, tin e a riferimento allo stesso oggetto. Ma questo è un oggetto immutabile. Così, quando la funzione tenta di modificarlo, tin ricevere un nuovo oggetto con la modifica, mentre a mantiene un riferimento all'oggetto originale. In questo caso, restituire tin è obbligatorio, altrimenti il ​​nuovo oggetto andrebbe perso.

Esercizio

>>> def yoda(prologue, sentence):
    sentence.reverse()
    prologue += " ".join(sentence)
    return prologue

>>> focused = ["You must", "stay focused"]
>>> saying = "Yoda said: "
>>> yoda_sentence = yoda(saying, focused)

Nota: il reverse funziona sul posto.

Cosa ne pensi di questa funzione? Ha effetti collaterali? Il reso è necessario? Dopo la chiamata, qual è il valore di saying ? Di focused ? Cosa succede se la funzione viene richiamata con gli stessi parametri?