Python动态默认参数overwri

2024-06-02 10:57:46 发布

您现在位置: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__)

令我惊讶的是,最后一个print语句返回了{'dt': {'a': 1}},而不是{}。虽然一开始我很困惑,但我想我现在明白发生了什么。通过‘更新’对象self.dt,我不仅改变了对象d1的属性,还改变了类的参数dt。你知道吗

我的解决方案是永远不要将默认参数指定为list、dict或类似的(除非需要这个特性),而是始终使用None

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

    self.dt = dt

但有没有更优雅的方法来解决这个“问题”?你知道吗


Tags: 对象selfnonenew参数initdefdt
1条回答
网友
1楼 · 发布于 2024-06-02 10:57:46

你的解决方案是正确的。这种行为发生在任何可变对象上,例如列表。因此,应该始终使用None(或不可变对象)作为默认参数。你知道吗

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

相关问题 更多 >