python中另一个令人讨厌的副作用

python中另一个令人讨厌的副作用,python,immutability,mutable,Python,Immutability,Mutable,我在python中得到了一个非常意外和非常恶劣的副作用,我不理解。在以下示例中: >>> class MyClass(object): ... def __init__(self, a = [0]): ... print(a) ... self.a = a ... >>> myinstance1 = MyClass() [0] >>> myinstance1.a.append(1) >>&

我在python中得到了一个非常意外和非常恶劣的副作用,我不理解。在以下示例中:

>>> class MyClass(object):
...     def __init__(self, a = [0]):
...         print(a)
...         self.a = a
... 
>>> myinstance1 = MyClass()
[0]
>>> myinstance1.a.append(1)
>>> myinstance2 = MyClass()
[0, 1]
我希望第二个输出是[0]。但是,myinstance1成员的更改会导致此副作用。我认为,这种意外行为可能与可变/不可变对象有关。然而,在这种特殊情况下,我不明白发生了什么。有人知道怎么理解吗


如果myinstance1.a被MyClass中的方法更改,也会产生这种效果。myinstance1.a=[0,1]而不是myinstance1.a.append(1)不会产生此效果。。。花了我半天的时间:(

这是Python中众所周知的一个难题。每个人都至少被咬一次。参数默认值是在创建函数时计算的,而不是每次调用函数时。如果更改默认值,则会为每个人更改。