我加入了一个对我的编程风格非常危险的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
但有没有更优雅的方法来解决这个“问题”?你知道吗
你的解决方案是正确的。这种行为发生在任何可变对象上,例如列表。因此,应该始终使用None(或不可变对象)作为默认参数。你知道吗
https://docs.python.org/3.6/reference/datamodel.html
相关问题 更多 >
编程相关推荐