何时使用 defaultdict 与使用副本

对于下面的情况使用 acopy和 a方法有什么区别?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)


    ...

看来第一种方法是错误的对象类型,但是有人可以澄清这两种方法之间的区别以及为什么这不起作用吗?


阿晨1998
浏览 74回答 1
1回答

牧羊人nacy

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.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python