Ale dlaczego podobnie nie działą to w przypadku tablicy??
To nie jest kwestia tablic ani obiektów, tylko argumentów domyślnych funkcji.
In [1]: def f(argument=777):
...: return argument
In [2]: f()
Out[2]: 777
In [6]: a = f()
In [7]: b = f()
In [8]: a is b
Out[8]: True
Tak naprawdę wartość domyślna to zawsze jest ten sam obiekt, więc wszystkie wywołania funkcji dzielą ten sam obiekt. Dlatego modyfikowanie tego samego obiektu jest widoczne wszędzie tak samo. Jeśli argument domyślny to liczba, to dzieje się to samo; po prostu to trudniej zaobserwować.
To jest faktycznie nieintuicyjne zachowanie argumentów domyślnych; w większości innych języków zachowuje się to tak, jak byś się spodziewał.
W każdym razie, zazwyczaj rozwiązuje się to tak:
def __init__(self, x=0, y=None):
self.x = x
if y is None:
y = []
self.y = y