关于hash:检查字典中是否存在密钥比在Python中捕获KeyError更好?

Is checking for the existence of a key in a dictionary better than catching a KeyError in Python?

我在Python方面有一些经验,但我正在参加Udacity计算机科学课程,以填补我所学的空白,补充我已经知道的内容。课程介绍了一个哈希表查找函数,如果键不在哈希表中,该函数将不返回键的值。当键不存在时,python的字典类型会抛出一个keyerror,因此课程建议在获取值之前使用key in mydict

我想知道的是,这样做是否更好:

1
2
3
4
5
6
7
mydefaultval = 75
key = ..
mydict = ..
if key in mydict:
    val = mydict[key]
else:
    val = mydefaultval

…或

1
2
3
4
5
6
7
mydefaultval = 75
key = ..
mydict = ..
try:
    val = mydict[key]
except KeyError:
    val = mydefaultval

我可以想象,为了让Python检查这个键是否存在,它必须在字典中找到它。如果我在那个键上获取值,它必须做同样的事情两次。我这样想是正确的,还是python会做其他的事情?


最好是使用dict.get:

1
val = my_dict.get(key, mydefaultval)

如果没有一个很棒的方法,我建议使用例外。Python文化是例外是不被禁止的,而且通常明确的检查实际上会捕获异常。


如果每次使用特定dict时,默认值都相同,则另一个选项是使用collections.defaultdict。声明dict比dict.get()解决方案更为冗长,但使用起来更为简洁:

1
2
3
4
>>> from collections import defaultdict
>>> mydict = defaultdict( lambda: 75 )
>>> mydict[3]
75