我對以下行為感到有些困惑。我正在從字典中檢索值,這樣如果一個鍵不存在,我會呼叫一個函式來創建該值并將其插入到字典中。我通過方法的default引數來做到這一點dictionary.get。問題是即使值已經存在于字典中,默認函式也會被呼叫。真是令人難以置信。關于為什么會發生這種情況的任何想法?
dictionary = {}
def load_default(key):
print("Inside function")
value = "world"
dictionary[key] = value
return value
print(dictionary)
'{}' #empty dict, everything ok
value = dictionary.get("hello", load_default("hello"))
'Inside function' # we ask for "hello", which does not exist so we call load_default
print(dictionary)
"{'hello': 'world'}" # the dict now contains de key "hello"
value = dictionary.get("hello", load_default("hello"))
'Inside function' # we ask for "hello" again, but load_default is called instead ("Inside function" is printed) I would expect the dict to return only the value and not call `load_default`
在給定的示例中,我希望字典在world不呼叫 load_default函式的情況下回傳值
uj5u.com熱心網友回復:
在給定的示例中,我希望字典在不呼叫 load_default 函式的情況下回傳值 world。
在執行dictionary.get("hello", load_default("hello"))Python 時,首先評估作為引數傳遞給.get()方法的運算式,然后使用從提供的引數的評估中獲得的值呼叫該方法。
第一個傳遞的運算式是一個值“hello”,因此可以按.get()原樣傳遞。第二個作為引數傳遞的運算式load_default("hello")需要評估為一個值,因為它是對函式的呼叫。要獲得一個值,必須執行函式,然后函式的結果回傳值將作為第二個引數傳遞給.get().
在那個階段.get()還沒有執行,所以假設load_default()只有當鍵不在字典中時函式才會運行是錯誤的,導致混亂。
換句話說.get(),它將在它的引數作為值傳遞之后執行,并且因為函式呼叫不是一個值,所以它需要被評估為一個值,因此load_default()將在每次呼叫.get().
PS Python 在其新版本中實際上不斷優化速度。因此從理論上講,由于某些優化不會一次又一次地運行相同的函式或方法呼叫,如果與具有已知回傳值和已知邊的先前呼叫沒有任何改變,則可能會發生上述情況并非總是如此 -效果可以通過優化演算法保存在記憶體中,然后在下一次函式呼叫時重用。一般來說,觀察到的結果行為應該保持不變,并且只有通過突然縮短執行具有相同引數的相同函式或方法所需的時間才能感知到優化的使用(在對函式/方法進行速度基準測驗時可能會導致混淆)否則耗時的函式呼叫幾乎立即產生結果)。
PSPS 隨著深入的時間優化,在某些未來的 Python 版本中,函式/方法傳遞的引數將僅“按需”評估,并且期望函式呼叫作為引數不會被執行,如果 this 的值引數最終沒有使用正確的引數。
PS 和 PSPS 的結論是,最好不要將自己的代碼依賴于當前可能仍然正確的事實,即在執行函式/方法之前評估傳遞給函式/方法的引數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/526852.html
標籤:Python字典
