簡體   English   中英

令人困惑的python dict.get() 行為與默認的dict 索引

[英]perplexing python dict.get() behavior with default dict index

所以我在使用 python 中的 dict.get() 方法和 dict[index] 的默認值時遇到了一個令人困惑的問題:

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

我有點不明白為什么會發生這種情況......在我看來, d2索引永遠不應該被調用,因為鍵 1 存在於d 我猜這是我遺漏的一個實現細節,似乎找不到更多信息。

對我有什么幫助/希望嗎?

用於get (或任何函數)的參數的表達式必須在調用get之前進行評估。 Python 沒有惰性求值語義,這是語言定義的一部分,而不是 CPython 的實現細節。

將此與defaultdict類型之類的東西進行比較,后者采用返回默認值的可調用對象,而不是默認值本身。

defaultdict(lambda: 3)  # not defaultdict(3)
defaultdict(int)  # not defaultdict(0); int happens to return
                  # 0 when called with no arguments.

但是, get需要一個值,而不是一個可以調用以生成值的函數。

d.get(1, d2[1])不是像if那樣的條件/分支語句或表達式,它只是一個普通的方法調用,所以所有的代碼都是無條件地計算的。

在調用get方法之前,需要評估其參數。 d2[1]是第二個參數,因此在調用該方法之前對其進行評估 - 引發 KeyError 。 所以這是預期的行為,而不是實現細節。

要執行您想要的操作,您可以使用如下所示的條件表達式,它只會在兩個字典都沒有鍵時引發 KeyError。 除非條件為假,否則不會計算表達式d2[1] ,因為if表達式會發生分支。

d[1] if 1 in d else d2[1]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM