2017-04-24 5 views
0

プログラミングのスタイルに非常に危険なPythonの機能に取り掛かりました。私はこれらの葛藤を解決するためにはどのパターンが最善だろうと思った。 follwoingの例では、良い洞察最後のprint文は{'dt': {'a': 1}}なく{}を返された私の驚きにPythonの動的なデフォルトのパラメータの上書き

class TestObject(): 

    def __init__(self, dt = {}): 
     self.dt = dt 

    def update_dt(self, new_dt): 
     for k, v in new_dt.items(): 
      self.dt[k] = v 


def main(): 
    first = {'a': 1} 

    d1 = TestObject() 
    print(TestObject().__dict__) 

    d1.update_dt(first) 
    print(TestObject().__dict__) 

を与える必要があります。最初は困惑していましたが、今何が起こるのか分かりました。 self.dtを「更新」することにより、オブジェクトd1の属性だけでなく、クラスのパラメータdtも変更しています。

私のソリューションは、(この機能が欲しかっされていない限り)、リスト、辞書または類似のように、デフォルトのパラメータを指定しないようになり、常に代わりにNoneを使用しない、すなわち

def __init__(self, dt = None): 
    if dt is None: 
     dt = {} 

    self.dt = dt 

しかし、よりエレガントな方法があるでしょうこの「問題」に取り組む?

+0

「dtがNoneではない」とはどういう意味ですか? – Jacobr365

+1

それはそれを行う方法です:[なぜオブジェクト間でデフォルト値が共有されるのですか?](https://docs.python.org/3/faq/programming.html#why-are-default-values- Pythonのよくある質問のオブジェクト間の共有)。 –

+0

http://stackoverflow.com/questions/1132941/least-astonishment-and-the-mutable-default-argument –

答えて

0

解決策は正しいです。この現象は、リストなどの変更可能なオブジェクトで発生します。したがって、デフォルトのパラメータとして常にNone(または変更不可能なオブジェクト)を使用する必要があります。

https://docs.python.org/3.6/reference/datamodel.html

関連する問題