programowanieBackend developer

Jak działa mechanizm przekazywania parametrów w Pythonie (call by object reference / call by sharing)? Jak ma to wpływ na typy mutowalne i niemutowalne oraz jak uniknąć nieoczekiwanych zmian?

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź.

W Pythonie parametry są przekazywane na zasadzie 'call by object reference' (lub 'call by sharing'). Oznacza to, że funkcja otrzymuje odniesienie do obiektu, a nie sam obiekt. Jeśli obiekt jest mutowalny (mutable), to wewnątrz funkcji można zmieniać jego zawartość, a zmiany będą miały wpływ na zewnętrzną zmienną. W przypadku obiektów niemutowalnych (immutable), na przykład liczb lub ciągów znaków, zmiana wewnątrz funkcji tworzy nowy obiekt, nie wpływając na oryginalny.

Przykład dla obiektu mutowalnego:

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

Dla obiektu niemutowalnego:

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

Pytanie z podchwytliwym fragmentem.

Pytanie: "Czy w Pythonie zmienne są przekazywane do funkcji przez odniesienie czy wartość?"

Odpowiedź: Ani to, ani to w klasycznym rozumieniu. Zmienna przekazuje dokładnie odniesienie do obiektu, ale nie samą zmienną, i nie można zastąpić samego obiektu dla zewnętrznej zmiennej.

Przykłady rzeczywistych błędów spowodowanych niewiedzą na temat tego tematu.


Historia W jednym z projektów do parsowania danych funkcję używano do filtrowania listy. Nowa lista wewnątrz funkcji nie była tworzona, filtracja odbywała się poprzez zmiany oryginalnej listy. Prowadziło to do utraty oryginalnych danych — po kilku uruchomieniach skryptu danych już nie było.


Historia Młodszy programista uważał, że ciągi znaków można zmieniać "przez referencję" wewnątrz funkcji, ponieważ inne parametry (listy) można było zmieniać. W wyniku tego po wywołaniu funkcji program nie uzyskiwał oczekiwanych zmian (ciąg nie uległ zmianie), co powodowało niezrozumiałe błędy.


Historia W REST API do filtrowania danych wejściowych programista zapomniał stworzyć kopię słownika parametrów, a podczas walidacji wartości "ginęły" — parametry były usuwane z oryginalnego obiektu, co łamało logikę kolejnych żądań.