14

重複の可能性:
Python の「最小の驚き」: 変更可能な既定の引数

次の奇妙な動作を説明できる人はいますか?

私は次のクラスを持っています:

class Zoo:
    def __init__(self,alist=[]):
        self.animals = alist

    def __len__(self):
        return len(self.animals)

    def add(self,a):
        self.animals.append(a)

そして、私が次のことをすると、

In [38]: z=Zoo()
In [39]: z.add(2)
In [40]: z.add(23)
In [41]: len(z)
Out[41]: 2

In [42]: z2=Zoo()

In [43]: len(z2)
Out[43]: 2

z2.animals が空のリストではないのはなぜですか?

ありがとう、マティアス

4

2 に答える 2

15

コンストラクターでデフォルトの引数を変更しています (同じリストへの参照を各インスタンスにコピーしているだけです)。これは次のように修正できます。

class Zoo:
    def __init__(self,alist=None):
        self.animals = alist or []

    def __len__(self):
        return len(self.animals)

    def add(self,a):
        self.animals.append(a)
于 2012-04-12T13:01:04.647 に答える
6

デフォルトの引数リストはすべてのインスタンスで同じオブジェクトであるため、それをメンバーに割り当てると、同じオブジェクトへの参照が割り当てられるだけです。

例を次に示します。

>>> class foo():
...   def __init__(self, x = []):
...       print id(x)
... 
>>> x = foo()
140284337344168
>>> y = foo()
140284337344168
>>> z = foo()
140284337344168

xすべてのインスタンスで同じオブジェクトであることがわかります。

于 2012-04-12T13:02:58.413 に答える