2012-07-03 51 views
2

可能重複:
「Least Astonishment」 in Python: The Mutable Default Argument在蟒蛇__init__字典參數默認爲以前的類值

我發現,字典的參數給INIT()函數我的課是默認爲我之前在前面的例子中設置的值。我真的不明白這種行爲,而且它似乎沒有發生在列表或基本變量上。示例代碼:

class TestClass: 
    def __init__(
    self, 
    adir={}, 
    alist=[], 
    avar=None 
): 
    print("input adir: " + str(adir)) #for test2, shows test1.mydir 
    self.mydir = adir 
    self.mylist = alist 
    self.myvar = avar 

test1 = TestClass() 
test1.mydir['a'] = 'A' 
test1.mylist = ['foo'] 
test1.myvar = 5 

test2 = TestClass() 
print(test2.mydir) #has same value of test1! 
print(test2.mylist) 
print(test2.myvar) 

輸出看起來像這樣: 初始化TEST1 輸入ADIR:{} 初始化TEST2 輸入ADIR:{ '一個': 'A'} { 'A': 'A' } [] 無 爲什麼test2的字典參數(adir)被設置爲test1.mydir?特別是,爲什麼行爲與其他可變類型如列表不同?

謝謝!

+0

是'mydir'行爲不同於'mylist'是你設置*元素* test1.mydir'的'但是你更換'test1.mylist'的唯一原因。否則,這又是可變的默認參數問題。 – DSM

回答

2

正如DSM所說,不要修改可變默認參數。做到這一點,而不是:

class TestClass: 

    def __init__(self, adir=None, alist=None, avar=None): 
    if alist is None: 
     alist = [] 
    if adir is None: 
     adir = {} 
+1

+ infinity。 (* ahem * - 差不多)總是使用'None'默認值 – inspectorG4dget

+0

非常感謝,我之前從未意識到這個問題......現在我知道了這個問題,我做了一些Google搜索。對於後人來說,[這篇文章](http://effbot.org/zone/default-values.htm)並不是討論這裏發生的事情。 – Caleb