2012-04-04 18 views
1

可能性の重複:
“Least Astonishment” in Python: The Mutable Default Argument__init __(self、list = [])は、インスタンス化ごとに新しいリストではなくリストを作成しますか?

なぜこれがある:これとは異なる

class Test: 
    def __init__(self, items=[]): 
     self.items=items 

class Test2: 
    def __init__(self, items=None): 
     if items: 
      self.items=items 
     else: 
      self.items = [] 

THOS eは、彼らが同じことを行う必要があるように見えるが、:

>>>t = Test() 
>>>t.items.append("stuff") 
>>>t.items 
['stuff'] 
>>>t2 = Test() 
>>>t2.items 
['stuff'] 

[OK]を、テスト()として、作成されたリストが1つのみだし、誰もが、私は明示的に内の項目を設定していたと思った何にもかかわらず、それをアクセスしていますクラスの名前空間に入れないでください。しかし、Test2の場合:

>>>t = Test2() 
>>>t.items.append("stuff") 
>>>t.items 
['stuff'] 
>>>t2 = Test2() 
>>>t2.items 
[] 

これは私が期待しているように動作しています。また、テストでは、t = Test([])のように、デフォルトを作業させるのではなく、空のリストで明示的に呼び出すと、インスタンス間でデータを共有しません。

デフォルトでは、動的にではなくコンパイル時に1回しか作成されませんか?それは一般的な関数ではなく、クラス定義の場合にのみ当てはまりますか、これは引数リストでデフォルトを使うより一般的な落とし穴ですか? (回答:関数でも起こります)

これはリストの代わりに文字列でテストし、インスタンス間でデータが共有されない場合の動作が期待されています。しかし、それはディクテーションでも起こります。

答えて

関連する問題