使用默认的dict索引使python dict.get()行为困惑

时间:2020-02-10 20:43:02

标签: python python-3.x dictionary indexing

因此,在python中将dict.get()方法与默认值dict [index]结合使用时,我遇到了一个令人困惑的问题:

d = {1: 1}
d2 = {2: 2}
#throws KeyError
d.get(1, d2[1])

对于为什么会发生这种情况我有些迷茫。...在我看来,d2索引永远不会被调用,因为键1存在于d中。我猜这是我所缺少的实现细节,似乎找不到更多信息。

对我有帮助/希望吗?

2 个答案:

答案 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]