1. <tbody id="y0n05"><nobr id="y0n05"><input id="y0n05"></input></nobr></tbody><strong id="y0n05"><acronym id="y0n05"></acronym></strong>

          1. 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
            你也可以使用包含一個字典的全局變量而不使用參數默認值;這完全取決于個人偏好。

            關聯標簽:
            国产欧美日韩激情视频一区,久久无码中文字幕无码网站,99久久久成人毛片无码,国产国语脏话对白免费视频,丰满熟女大屁股水多多