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
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']
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ę dzieje | ponowne przypisanie lokalnej nazwy items | zmiana obiektu, do którego items wskazuje |
| Czy widzisz to z zewnątrz po rozmowie?" | nie – wszystko jest takie samo jak na zewnątrz | tak – 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