您需要了解的默認值,以便有效地使用它們是如何工作的。
功能是對象。因此,它們具有屬性。所以,如果我創建這個功能:
>>> def f(x, y=[]):
y.append(x)
return y
我已經創建了一個對象。這裏是它的屬性:
>>> dir(f)
['__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__',
'__dict__', '__doc__', '__format__', '__get__', '__getattribute__', '__globals__',
'__hash__', '__init__', '__module__', '__name__', '__new__', '__reduce__',
'__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__',
'func_closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals',
'func_name']
其中之一是func_defaults
。聽起來很有希望,那裏有什麼?這是一個包含函數默認值的元組。如果默認值是一個對象,則該元組包含該對象的一個實例。
這會導致一些非常違反直覺的行爲,如果你認爲f
增加了一個項目列表,返回只包含項目的列表,如果沒有提供列表:
>>> f(1)
[1]
>>> f(2)
[1, 2]
但是,如果你知道默認值是一個儲存在該函數的屬性之一的對象實例,它更是違反直覺:
>>> x = f(3)
>>> y = f(4)
>>> x == y
True
>>> x
[1, 2, 3, 4]
>>> x.append(5)
>>> f(6)
[1, 2, 3, 4, 5, 6]
認識到這一點,很明顯,如果你想要一個函數的參數的默認值是一個新的列表(或任何新的ob ject),你不能簡單地在func_defaults
中存儲對象的一個實例。每次調用函數時都必須創建一個新的函數:
>>>def g(x, y=None):
if y==None:
y = []
y.append(x)
return y
如果解決了問題,您應該接受答案!幾個答案似乎非常豐富。儘管這個問題還很陳舊,但我認爲給出一個批准的答覆是一個好主意 – eipxen 2011-11-29 18:31:45
[[Python中的「最小的驚訝」:可變的默認參數]可能的重複(http://stackoverflow.com/問題/ 1132941/python-the-mutable-default-argument中的令人驚訝的事情) – 2013-07-12 00:06:22