Dziwne zachowanie kodu
def func1(a=[]):
wynika stąd, że Python wartości domyślne (w powyższym jest to [ ] )
tworzy tylko raz - przy uruchamianiu programu - a potem korzysta z odnośnika do tej wartości.
Przy każdym uruchomieniu tej funkcji bez podania własnego parametru "a"
korzysta ona z tej wczejśniej utworzonej listy a nie tworzy za każdym razem nowej.
Można powiedzieć, że jest to równoważne z
ukryta_lista = [] # utworzenie jednej listy na poczatku
def func1(a=ukryta_lista): # przypisywanie `ukrytej_listy` do `a`
Do tego dochodzi fakt, że po poniższym przypisaniu
a = ukryta_lista
Zmienna `a` nie zawiera kopii `ukrytej listy` tylko wskazuje dokładnie na `ukrytą listę` (na to samo miejsce w pamięci). Tak więc późniejsze działania na liście `a` jest równoważne działaniu bezpośrednio na `ukrytej liście`.
Problem rozwiązuje się z użyciem `None`
def func1(a=None):
if a is None:
a = []