我有一个函数来创建一个带有特定键的字典,它接受一个参数来指定每个键" s"默认"价值应该是。
UIView
问题在于,当我用def new_dict(entrys_default=0):
my_dict = {}
for k in ['a', 'b', 'c']:
my_dict[k] = entrys_default
return my_dict
调用它时,字典中的每个条目都会创建一个新的空列表作为其值,然后我用new_dict(entrys_default=[])
更新一个条目然后所有条目都已更新:
returned_dict['a'].append(123)
使用整数时不会发生这种情况,我明白这是因为{'a': [123], 'b': [123], 'c': [123]}
在它是一个整数时是不可变的,但是当它是一个列表时它是对同一个列表的引用或者字典。
我希望能够使这个函数与列表和字典为entrys_default
的整数参数一样工作 - 即每个条目都有自己的列表/字典 - 但是希望保持函数的灵活性也适用于整数。
任何人都可以建议最佳方式来解决这个问题吗?
答案 0 :(得分:2)
执行collections.defaultdict
所做的事情;而不是采用“示例”默认值,取一个返回所需默认值的函数。然后调用该函数并使用其返回值初始化正在构造的dict
的每个元素。
def new_dict(make_default=int): # int() == 0
my_dict = {}
for k in ['a', 'b', 'c']:
my_dict[k] = make_default()
return my_dict
d = new_dict(list) # list() == [], but a distinct list each time it is called
d['a'].append(123)
assert d['a'] != d['b']