对于以下情况,使用copy
和defaultdict
方法有什么区别
base_data = {...}
for item in iterable:
# approach 1 <-- why wouldn't this work?
data = defaultdict(lambda: base_data)
# approach 2
data = deepcopy(base_data)
...
第一种方法似乎是错误的对象类型,但是有人能澄清这两种方法之间的区别是什么,以及为什么这不起作用吗
Tags:
deepcopy
制作原始dict
的全新深度副本;新副本与原始副本完全分离,因此对其中一个副本的后续修改不会影响另一个副本defaultdict(lambda: base_data)
生成一个dict
,每当括号内的键查找失败时,插入该键的值是base_data
的别名(因此修改任何值都会修改所有值,就像b = a
然后对a
或b
执行变异操作会影响这两个值一样)defaultdict
的默认“构造函数”应该总是返回一个不可变类型(别名可以,因为它们不能被变异)或一个全新的独立可变类型(例如,对于具有不可变值的base_data
,具有defaultdict(base_dict.copy)
的浅拷贝有效;对于具有可变值的base_data
,您需要一个深拷贝来保持它们的独立性,defaultdict(lambda: copy.deepcopy(base_data))
,或者只是将定义base_data
的文本复制到lambda
中(如果足够短)#1有一个用例(制作一个完全独立的副本,可以在不影响其他副本的情况下进行更新)
#2,正如你所写的,只是没有;所有键之间共享的许多可变类型的别名基本上是无用的;您需要复制或重新构造以默认为可变值,从而生成有用的
defaultdict
相关问题 更多 >
编程相关推荐