何时使用defaultdict与使用copy

2024-09-28 23:22:04 发布

您现在位置:Python中文网/ 问答频道 /正文

对于以下情况,使用copydefaultdict方法有什么区别

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: 方法infordatabase情况thisiterable
1条回答
网友
1楼 · 发布于 2024-09-28 23:22:04
  1. deepcopy制作原始dict的全新深度副本;新副本与原始副本完全分离,因此对其中一个副本的后续修改不会影响另一个副本

  2. defaultdict(lambda: base_data)生成一个dict,每当括号内的键查找失败时,插入该键的值是base_data的别名(因此修改任何值都会修改所有值,就像b = a然后对ab执行变异操作会影响这两个值一样)

    defaultdict的默认“构造函数”应该总是返回一个不可变类型(别名可以,因为它们不能被变异)或一个全新的独立可变类型(例如,对于具有不可变值的base_data,具有defaultdict(base_dict.copy)的浅拷贝有效;对于具有可变值的base_data,您需要一个深拷贝来保持它们的独立性,defaultdict(lambda: copy.deepcopy(base_data)),或者只是将定义base_data的文本复制到lambda中(如果足够短)

#1有一个用例(制作一个完全独立的副本,可以在不影响其他副本的情况下进行更新)

#2,正如你所写的,只是没有;所有键之间共享的许多可变类型的别名基本上是无用的;您需要复制或重新构造以默认为可变值,从而生成有用的defaultdict

相关问题 更多 >