Python中dict.get('key')和dict['key']有什么区别?

31

为什么会抛出KeyError错误:

d = dict()
d['xyz']

但是这并不?

d = dict()
d.get('xyz')

我也很好奇描述符在这里是否起到了作用。


4
这两种方式的实际区别就是能够自由处理None(或指定默认值)或异常,你需要掌握这一点。你对具体实现细节感兴趣吗? - TigerhawkT3
谢谢,是的,我对更低层次的细节很好奇,特别是如何通过“if k in d”结构避免KeyError。如果d['xyz'](如果'xyz'不存在)会出现KeyError,那么这是因为这是对字典对象的“原始”或直接访问吗?看起来我的问题的答案是“因为它就是这样工作的”,所以也许我在最终的设计决策上过于苛求了,即何时引起麻烦,何时不引起。 - foundling
较低级别的细节并不难想象;您可以通过在keyError上返回传入的第二个参数来编写等效的方法。 - Kyle Baker
4个回答

31

这就是get()方法的定义。

来自Python文档

如果字典中存在键key,则返回其对应的值,否则返回默认值。如果未提供默认值,则默认为None,因此该方法永远不会引发KeyError异常。

默认的“未找到”返回值是None。您可以返回任何其他默认值。

d = dict()
d.get('xyz', 42)  # returns 42

5

通过方括号访问没有默认值,但是get方法有默认值,而默认值是None。可以通过a = dict(); help(a.get)查阅get方法的文档。

Help on built-in function get:

get(...)
    D.get(k[,d]) -> D[k] if k in D, else d.  d defaults to None.

3

仅仅因为 [1] 键不在映射中,以及 [2] 这两个操作的性质不同。

来自 字典 映射类型:

d[key]

返回具有键key的d的项。如果key不在映射中,则引发KeyError。

get(key[, default])

如果字典中有键 key,则返回该键对应的值,否则返回默认值。如果没有指定默认值,则默认为 None,因此此方法永远不会引发 KeyError 异常。

1
你的开头问题已经得到了很好的回答,但我没有看到任何回应。
“我也很想知道描述符在这里是否起作用。”
从技术上讲,描述符确实在这里起作用,因为所有方法都是使用描述符隐式实现的,但没有明确使用描述符,并且它们与你所质疑的行为无关。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接