Python Language Passaggio di argomenti e mutabilità


Esempio

Innanzitutto, alcuni termini:

  • argomento (parametro attuale ): la variabile attuale passata a una funzione;
  • parametro (parametro formale ): la variabile ricevente che viene utilizzata in una funzione.

In Python, gli argomenti vengono passati per assegnazione (al contrario di altri linguaggi, dove gli argomenti possono essere passati per valore / riferimento / puntatore).

  • La modifica di un parametro muterà l'argomento (se il tipo dell'argomento è modificabile).

    def foo(x):        # here x is the parameter
        x[0] = 9       # This mutates the list labelled by both x and y
        print(x)
    
    y = [4, 5, 6]
    foo(y)             # call foo with y as argument
    # Out: [9, 5, 6]   # list labelled by x has been mutated
    print(y)           
    # Out: [9, 5, 6]   # list labelled by y has been mutated too
    
  • La riassegnazione del parametro non riassegnerà l'argomento.

    def foo(x):        # here x is the parameter, when we call foo(y) we assign y to x
        x[0] = 9       # This mutates the list labelled by both x and y
        x = [1, 2, 3]  # x is now labeling a different list (y is unaffected)
        x[2] = 8       # This mutates x's list, not y's list
      
    y = [4, 5, 6]      # y is the argument, x is the parameter
    foo(y)             # Pretend that we wrote "x = y", then go to line 1
    y
    # Out: [9, 5, 6]
    

In Python, non assegniamo realmente valori alle variabili, ma leghiamo (cioè assegniamo, attribuiamo) variabili (considerate come nomi ) agli oggetti.

  • Immutabile: numeri interi, archi, tuple e così via. Tutte le operazioni fanno copie.
  • Mutabile: elenchi, dizionari, set e così via. Le operazioni possono o non possono mutare.
x = [3, 1, 9]
y = x
x.append(5)    # Mutates the list labelled by x and y, both x and y are bound to [3, 1, 9]
x.sort()       # Mutates the list labelled by x and y (in-place sorting)
x = x + [4]    # Does not mutate the list (makes a copy for x only, not y)
z = x          # z is x ([1, 3, 9, 4])
x += [6]       # Mutates the list labelled by both x and z (uses the extend function).
x = sorted(x)  # Does not mutate the list (makes a copy for x only).
x
# Out: [1, 3, 4, 5, 6, 9]
y
# Out: [1, 3, 5, 9]
z
# Out: [1, 3, 5, 9, 4, 6]