0
我进入python的一个功能,对我的编程风格非常危险。我想知道哪种模式最适合解决这些冲突。该follwoing例子应该给一个很好的洞察力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__)
令我惊讶的最后一个print语句返回{'dt': {'a': 1}}
而不是{}
。起初我很困惑,我想我现在明白发生了什么。通过'更新'self.dt
我不仅改变了对象d1
的属性,而且改变了该类的参数dt
。
我的解决办法是从来没有指定默认参数为列表,字典或类似的(除非该功能被通缉),并一直使用无替代,即
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的FAQs之间的共享对象)。 –
http://stackoverflow.com/questions/1132941/least-astonishment-and-the-mutable-default-argument –