因此,在python中将dict.get()方法与默认值dict [index]结合使用时,我遇到了一个令人困惑的问题:
d = {1: 1}
d2 = {2: 2}
#throws KeyError
d.get(1, d2[1])
对于为什么会发生这种情况我有些迷茫。...在我看来,d2
索引永远不会被调用,因为键1存在于d
中。我猜这是我所缺少的实现细节,似乎找不到更多信息。
对我有帮助/希望吗?
答案 0 :(得分:4)
在调用get
之前,必须先评估用于get
(或任何函数)的参数的表达式。 Python没有惰性的评估语义,这是该语言定义的一部分,而不是CPython的实现细节。
将此与类似defaultdict
的类型进行比较,该类型需要一个 callable ,该返回默认值,而不是默认值本身。
defaultdict(lambda: 3) # not defaultdict(3)
defaultdict(int) # not defaultdict(0); int happens to return
# 0 when called with no arguments.
get
期望值,而不是可以调用以产生值的函数。
答案 1 :(得分:1)
d.get(1, d2[1])
不是像if
这样的条件/分支语句或表达式,它只是普通的方法调用,因此所有代码都是无条件求值的。
在调用get
方法之前,需要先评估其参数。 d2[1]
是第二个参数,因此将在调用该方法之前对其进行评估-引发KeyError。因此,这是预期的行为,而不是实现细节。
要执行所需的操作,可以使用如下所示的条件表达式,该条件表达式仅在两个字典都没有键时才会引发KeyError。除非条件为假,否则不对表达式d2[1]
求值,因为if
表达式会分支。
d[1] if 1 in d else d2[1]