为了账号安全,请及时绑定邮箱和手机立即绑定

何时使用 defaultdict 与使用副本

何时使用 defaultdict 与使用副本

阿晨1998 2024-01-27 15:42:29
对于下面的情况使用 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个赞

  1. deepcopy对原件进行全新的深度复制dict;新副本与原始副本完全分离,因此对其中一个副本的后续修改根本不会影响另一个副本。

  2. 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.


查看完整回答
反对 回复 2024-01-27
  • 1 回答
  • 0 关注
  • 21 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信