可能重複:
「Least Astonishment」 in Python: The Mutable Default Argument終身變量的
考慮以下兩個功能
def a(var=[0]):
print (var)
var = var + [4]
def b(var=[0]):
print (var)
var.append(4)
他們應該採取行動一樣,但更重要的是,無論是應該只打印'[0]',如果沒有參數調用。該行爲非常不同,只有a()會一直打印'[0]'。
>>> a()
[0]
>>> a()
[0]
>>> a()
[0]
>>> b()
[0]
>>> b()
[0, 4]
>>> b()
[0, 4, 4]
爲什麼a()函數與b()不同?
好像如果你希望變量與不變量是過去的功能的情況下默認被覆蓋,你不能使用列表API。如果你做的功能將'記住'它以前的變量。
在我的代碼的情況出現在一個遞歸函數,所以只是「del'-ING不需要的變量將沒有真正的工作。每次調用沒有參數的函數時,是否有覆蓋變量的方法?
小時後和研究的時間,我發現這一點。這可能與上述問題有關,並可能導致答案。我們可以定義一輩子類,像這樣:
class lifetime: # adapted from http://naml.us/blog/tag/variable-lifetime
def __init__(self, name):
self.name = name
print ('creating: ' + name)
def __del__(self):
print ('destroying: ' + self.name)
def __iadd__(self, a):
self.append(a)
def append(self, a):
self.name += ' and ' + a.name
print('appending: ' + a.name + ' to ' + self.name)
,然後定義2個功能:
def a(var=lifetime('a')):
print (var)
var += life('appendage')
def b(var=lifetime('b')):
print (var)
var.append(life('appendage'))
>>> a()
<__main__.lifetime object at 0x00000000031FFA90>
creating: appendage
appending: appendage to a and appendage
destroying: appendage
>>> a()
<__main__.lifetime object at 0x00000000031FFA90>
creating: appendage
appending: appendage to a and appendage and appendage
destroying: appendage
>>> b()
<__main__.lifetime object at 0x00000000031FFB38>
creating: appendage
appending: appendage to b and appendage
destroying: appendage
>>> b()
<__main__.lifetime object at 0x00000000031FFB38>
creating: appendage
appending: appendage to b and appendage and appendage
destroying: appendage
現在看來似乎只是將評估參數的默認一次,然後使用任何評價爲是。它從不說'創造:一個'或'創造:b'。因此,也許如果每次都評估默認參數,它會導致回答實際問題。
尤見[這個答案](HTTP ://stackoverflow.com/a/10304917/577088)爲每次調用函數時創建新的可變默認值的慣用方法 - 還有[tutorial](http://docs.python.org/tutorial/) controlflow.html#默認參數的值)。 – senderle 2012-07-07 19:18:25