2017-04-24 71 views
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 

但有一个更优雅的方式来解决这个'问题'?

+0

你的意思是,'如果dt不是None'? – Jacobr365

+1

这就是实现它的方式:查看[为什么在对象之间共享默认值?](https://docs.python.org/3/faq/programming.html#why-are-default-values- Python的FAQs之间的共享对象)。 –

+0

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

回答