プログラミングのスタイルに非常に危険な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
しかし、よりエレガントな方法があるでしょうこの「問題」に取り組む?
「dtがNoneではない」とはどういう意味ですか? – Jacobr365
それはそれを行う方法です:[なぜオブジェクト間でデフォルト値が共有されるのですか?](https://docs.python.org/3/faq/programming.html#why-are-default-values- Pythonのよくある質問のオブジェクト間の共有)。 –
http://stackoverflow.com/questions/1132941/least-astonishment-and-the-mutable-default-argument –