对于下面的情况使用 acopy和 a方法有什么区别?defaultdictbase_data = {...}for item in iterable: # approach 1 <-- why wouldn't this work? data = defaultdict(lambda: base_data) # approach 2 data = deepcopy(base_data) ...看来第一种方法是错误的对象类型,但是有人可以澄清这两种方法之间的区别以及为什么这不起作用吗?
1 回答
牧羊人nacy
TA贡献1862条经验 获得超7个赞
deepcopy
对原件进行全新的深度复制dict
;新副本与原始副本完全分离,因此对其中一个副本的后续修改根本不会影响另一个副本。defaultdict(lambda: base_data)
dict
每当对某个键的括号查找失败时,都会插入带有别名的值的键base_data
(因此修改任何值都会修改所有值,同样的方式b = a
后跟对两者进行变异操作或a
影响b
两者)。defaultdict
的默认“构造函数”应该始终返回一个不可变类型(别名可以,因为它们不能改变)或一个全新的独立可变类型(例如,对于base_data
不可变值,可以使用浅拷贝defaultdict(base_dict.copy)
;对于base_data
可变值,您可以d 需要一个深层副本来保持它们独立,defaultdict(lambda: copy.deepcopy(base_data))
或者只是将定义的文字复制base_data
到 中lambda
(如果它足够短)。
#1 有一个用例(制作一个完全独立的副本,可以更新而不影响其他副本)。
#2,正如你所写的,只是没有;所有键之间共享的可变类型的许多别名本质上是无用的;您需要复制或全新构造来默认为可变值才能创建有用的defaultdict
.
添加回答
举报
0/150
提交
取消