Rozdział 13 · Automatyzacja z funkcjami

Argumenty zmienne i niezmienne

Jedna z najważniejszych lekcji rozdziału: przypisanie parametru i mutacja obiektu, na który on wskazuje, to dwie zupełnie różne czynności.

Niezmienny argument: rebinding nie wychodzi

immutable_argument.py
def add_one(number):
    number += 1
    print(number)

x = 10
add_one(x)
print(x)
11
10
add_one(x) drukuje 11, ale x na zewnątrz to 10
x10
Przed zgłoszeniem: 10 x →
x10number11
Wewnątrz add_one: number += 1 wiąże number z obiektem NEW 11 – x nie wpływa to
Nie „funkcja otrzymuje kopię x”
Dokładniej: number pierwsze wskazuje na to samo miejsce co x (o 10). Ale number += 1 jest number = number + 1: Tworzony jest NOWY obiekt 11, i number zaczyna wskazywać na niego. x nadal wskazuje na stary obiekt 10 - rozstali się.

Argument modyfikowalny: mutacja widoczna z zewnątrz

mutable_argument.py
def add_item(items):
    items.append("Python")

skills = ["Git"]
add_item(skills)
print(skills)
['Git', 'Python']
skills się zmienił, chociaż wywołaliśmy funkcję, a nie przypisaliśmy skills bezpośrednio
skills (na zewnątrz)items (parametr)['Git','Python']
skills i items — dwa imiona JEDNEJ listy; items.append(...) zmienia ją dla obu
To nie magia — to ten sam aliasing z rozdziału 11
items wewnątrz funkcji wskazuje na TEN sam lista obiekt co skills na zewnątrz. .append(...) mutuje ten współdzielony obiekt — więc zmiana jest widoczna przez oba nazwy. To dokładnie ta sama zasada aliasing, którą omawialiśmy w §11.9, tylko że teraz jedna z „dwóch nazw”

Rebinding vs mutation — porównujemy bezpośrednio

rebinding_vs_mutation.py
def replace(items):
    items = ["new"]      # rebinding: items teraz wskazuje na INNY lista

def modify(items):
    items.append("new")  #mutation: zmienia się TAK SAMO lista
replace(items)modify(items)
Co się dziejeponowne przypisanie lokalnej nazwy itemszmiana obiektu, do którego items wskazuje
Czy widzisz to z zewnątrz po rozmowie?"nie – wszystko jest takie samo jak na zewnątrztak – ten sam obiekt się zmienił
Główna zasada praktyczna
Przypisanie parametrowi (items = ...) usuwa lokalną nazwę z argumentu — nic się nie zmienia poza argumentem. Nazywanie metody mutacji (.append(), .sort(), [i] = ...) zmienia sam obiekt — a jest to widoczne z zewnątrz, jeśli obiekt jest zmienny.
Praktyka: rebinding vs mutation
interaktywny laptop bezpośrednio w przeglądarce – Python 3.14 przez Pyodide, bez instalacji
Otwórz praktykę →