為什麼Python中物件的預設值是共享的?
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
廣告