Python动态默认参数覆盖

时间:2017-04-24 13:20:40

标签: python

我进入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__)

令我惊讶的是,最后一个打印语句返回{'dt': {'a': 1}}而不是{}。虽然我一开始感到困惑,但我想我现在明白会发生什么。通过“更新”self.dt,我不仅更改了对象d1的属性,还更改了类的参数dt

我的解决办法是永远不要将默认参数指定为列表,字典或类似内容(除非需要此功能)并始终使用None,即

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

    self.dt = dt

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

1 个答案:

答案 0 :(得分:0)

您的解决方案是正确的。任何可变对象都会出现此问题,例如列表。因此,您应始终使用None(或非可变对象)作为默认参数。

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