python為什么對象之間會共享默認值?
小編:艷芬 703閱讀 2020.08.25
這種類型的缺陷通常會惹惱新手程序員??紤]這個函數
def foo(mydict={}):? # Danger: shared reference to one dict for all calls
? ? ... compute something ...
? ? mydict[key] = value
? ? return mydict
第一次調用此函數時,mydict 包含一項。第二次,mydict 包含兩項,因為當 foo() 開始執行時, mydict 中已經有一項了。
函數調用經常被期望為默認值創建新的對象。 但實際情況并非如此。 默認值會在函數定義時一次性地創建。 如果對象發生改變,就如本示例中的字典那樣,則對函數的后續調用將會引用這個被改變的對象。
按照定義,不可變對象例如數字、字符串、元組和 None 因為不可變所以是安全的。 對可變對象例如字典、列表和類實例的改變則可能造成迷惑。
由于這一特性,在編程中應遵循的一項好習慣是不使用可變對象作為默認值。 而應使用 None 作為默認值和函數中的值,檢查值為 None 的形參并創建相應的列表、字典或其他可變對象。 例如,不要這樣寫:
def foo(mydict={}):
? ? ...
而要這樣寫:
def foo(mydict=None):
? ? if mydict is None:
? ? ? ? mydict = {}? # create a new dict for local namespace
這一特性有時會很有用處。 當你有一個需要進行大量耗時計算的函數時,一個常見技巧是將每次調用函數的參數和結果值緩存起來,并在同樣的值被再次請求時返回緩存的值。 這稱為“記憶”,具體實現方式可以是這樣的:
# 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 the value
? ? result = ... expensive computation ...
? ? _cache[(arg1, arg2)] = result? ? ? ? ? ?# Store result in the cache
? ? return result
你也可以使用包含一個字典的全局變量而不使用參數默認值;這完全取決于個人偏好。
相關推薦
- Python 爬蟲面試題 170 道:2019 版 所有題目 語言特性 1.談談對 Python 和其他語言的區別2.簡述解釋型和編譯型編程語言3.Python 的解釋器種類以及相關特點?4.說說你知道的Python3 和 Python2 之間的區別?5.Python3 和 Python2 中 int 和 long 區別?6.xrange 和 range 的區別?編碼規范 7.什么…
- 自然語言處理工具python調用hanlp中文實體識別 Hanlp作為一款重要的中文分詞工具,在GitHub的用戶量已經非常之高,應該可以看得出來大家對于hanlp這款分詞工具還是很認可的。本篇繼續分享一篇關于hanlp的使用實例即Python調用hanlp進行中文實體識別。想要在python中調用hanlp進行中文實體識別,Ubuntu 16.04…
- 金蝶云GL0152參數為簡單模式,現金流量核算項目不能攜帶對方科目的外部核算項目 解決方案:【問題描述】GL0152參數為簡單模式,現金流量核算項目不能攜帶對方科目的外部核算項目【概述】EAS 8.0版本中可安裝補丁PT141029來解決此問題,請更新至該補丁或最新補丁即可?!静僮鞑襟E】1、獲取補?。捍蜷_EAS的【管理控制臺】→【補丁管理】→【補…