dict.pop 与 dict.get 关于默认返回值

rus*_*ro1 5 python dictionary python-3.x

我正在尝试找出将其None作为默认值dict.get但没有默认值(未指定默认值)的原因是什么dict.pop

{}.get('my_key')
# output: None
{}.pop('my_key')
# output: KeyError: 'my_key'
Run Code Online (Sandbox Code Playgroud)

我在想没有隐式默认值的原因dict.pop是因为你可能有带值的键,None所以为了不混淆你的键是否在字典中,隐式默认值 fordict.pop并没有那么多感觉。但话又说回来,这种解释也应该适用于dict.get并且不是:

{'my_key': None}.get('my_key')
# output: None
# but doesn't tell you if the key is truly in the dictionary or not
Run Code Online (Sandbox Code Playgroud)

r.o*_*ook 7

如果您主要关心的是字典中是否存在某个键,则应该通过'my_key' in my_dict. .get正如.pop您可以想象的那样,其用途略有不同。 .get是严格检索,.pop是检索删除。您将需要使用最适合您的用例的相应方法,如果您不需要处理KeyError.

至于为什么.pop默认不使用默认值,是因为该操作期望也从字典中删除一个键。如果操作成功完成而没有引发错误,则人们可能会错误地认为该键也会从字典中删除。

对于.get,该方法专门作为替代方法而存在,以提供该__getitem__方法的默认值,您通常将其语法视为my_dict['my_key']KeyError如果密钥不存在,后者将引发 a 。


che*_*ner 5

get从某种意义上说,存在两种类型:一种会引发 a KeyError,另一种不会。

>>> {}['my_key']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'my_key'
>>> {}.get('my_key')
>>>
Run Code Online (Sandbox Code Playgroud)

pop,另一方面,不是另一个引发 a 的操作的无错误版本KeyError,因此它在两种情况下都使用:KeyError默认引发 a ,但如果需要则返回默认值。

>>> {}.pop('my_key')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'my_key'
>>> {}.pop('my_key', 3)
3
Run Code Online (Sandbox Code Playgroud)


Fre*_*man 2

我对此的看法是允许 adict在不同的上下文中使用。

dict.get(key)即使键不存在于 中,我们也总是会得到一个值dict。可以提供默认值。没有例外。没有dict改变。

仅当中存在 时,我们dict.pop(key)才能获取值,否则会引发异常。我们可以通过提供默认值来避免异常。已更改。keydictdict

为了测试我们是否存在,key我们使用key in dict.

对于,这提供了与、 和提供的dict.pop类似接口。list.popset.popdeque.pop

简而言之,这是“最小惊喜原则” 和 Python 之禅的一个很好的例子(导入这个):)