def set_if_not_there(d, fields, default_value=None):
for field in fields:
if not field in d:
d[field] = default_value
d = { }
set_if_not_there(d, ['cnt1', 'cnt2'], 0)
set_if_not_there(d, ['tags1', 'tags2'], [])
d['cnt1'] += 1
d['tags1'].append('work')
print d
输出是:共享可变的问题?
{'tags2': ['work'], 'cnt2': 0, 'cnt1': 1, 'tags1': ['work']}
正如你所看到的,tags1
和tags2
实际上指的相同的列表,这不是预期的。 cnt1
和cnt2
工作正常。
我该如何执行set_if_not_there
,以便我创建可变的copies
,但仅在需要时?也就是说,如果默认值是“标量”(int,字符串,None
,...),则不需要副本,但对于列表和字符串,则需要副本。
+1我需要打印这种做法在我的心里,因为它是如此充满了好点! –
谢谢!任何违反'default_factory = default_factory或lambda:None'的情况? – dangonfast
这不会让你检测到像'set_if_not_there(d,['cnt1','cnt2'],False'(你打算使用'lambda:False'来代替))的错误。 –