Python中的預設值概念是基於使用可變或不可變物件。在程式設計實踐中,最好不要使用可變物件作為預設值。相反,使用None作為預設值以避免問題。不可變對象,如數字、字串、元組和None,不會改變。對於可變對象,如字典、列表和類別實例的變更可能會導致混淆。
讓我們來看一個函數中字典的範例以及它的問題以及如何修復它。
我們有一個函數。在這個函數中,我們有一個字典作為參數,並且設定了預設值。第一次呼叫這個函數時,mydict只包含一個項。第二次呼叫時,mydict包含兩個項,因為當foo()開始執行時,mydict已經有一個項。
def foo(mydict={}): ... calculate... mydict[key] = value return mydict
我們經常期望函數呼叫為預設值建立新的物件。然而,事實並非如此。預設值在函數定義時只會被建立一次。如果該物件被修改,例如上面的字典範例中,後續對函數的呼叫將引用這個被修改的物件。
要解決使用可變物件作為預設值的問題,像這樣 -
def foo(mydict={}): ...
使用不可變對象,如None -
def foo(mydict=None): if mydict is None: mydict = {}
當你有一個計算耗時的函數時,一種技術是快取每次呼叫函數的參數和結果值,並在再次請求相同值時傳回快取的值。
這被稱為記憶化,並且可以像這樣實現 -
# Callers can only provide two parameters and optionally pass _cache by keyword def expensive(arg1, arg2, *, _cache={}): if (arg1, arg2) in _cache: return _cache[(arg1, arg2)] # Calculate result = ... expensive computation ... _cache[(arg1, arg2)] = result return result
以下將結果儲存在快取中 −
_cache[(arg1, arg2)] = result
以上是為什麼在Python中物件之間共享預設值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!