我进入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
但有没有更优雅的方法来解决这个'问题'?
答案 0 :(得分:0)
您的解决方案是正确的。任何可变对象都会出现此问题,例如列表。因此,您应始终使用None(或非可变对象)作为默认参数。