`dict.pop` 忽略 `collections.defaultdict(default_factory)` 设置的默认值

jos*_*lle 1 python dictionary python-3.x defaultdict python-collections

Python 会dict.pop(key[, default])忽略由 设置的默认值,collections.defaultdict(default_factory)如以下代码片段所示:

from collections import defaultdict

d = defaultdict(lambda: 1)
d['a']
d['b'] = 2
print(d.pop('a')) # 1
print(d.pop('b')) # 2
print(d.pop('c', 3)) # 3
d.pop('e') # KeyError: 'e'
Run Code Online (Sandbox Code Playgroud)

d是一个defaultdict(lambda: 1). d.pop('e')导致KeyError. 这是故意的吗?不应该d.pop('e')返回,1因为这是设置的默认值defaultdict

Geo*_*rge 5

TL;DR:总之,defaultDict 将dict['inexistent-key']返回您的默认值,其他任何内容都应该具有与普通字典相同的行为。

解释

您链接的文档指出:

它重写一个方法[ __missing__()] 并添加一个可写实例变量[ default_factory]。其余功能与 dict 类相同,此处未记录。

这是在方法本身下进一步指定的,该方法由字典__missing__()调用:__getitem__()

请注意,__missing__()除了 之外,不会调用任何操作__getitem__()。这意味着get()它将像普通字典一样返回None默认值而不是使用default_factory。

因此,不仅pop()会有相同的行为,get()也会有相同的行为。拥有默认值的唯一方法是直接[key]在你的字典上使用。如果我们考虑一下,这绝对是对字典最相关的调用。