2011-05-14 32 views
4

我是acttualy有問題的代碼很長,所以我做了一個顯示我的問題的例子。Python遺留問題

我有兩個類從基類繼承(BaseClass)。這兩個類都將一些元素添加到self.Dict。但是,它們似乎交叉污染元素。我期待c0.Dict返回{ 'class0':0}c1.Dict返回{ 'class1的':1}。然而,他們都返回{'class0':0,'class1':1}。他們爲什麼交叉污染?

class BaseClass : 
    def __init__ (self, _dict={}) : 
     self.Dict = _dict 

class Class0 (BaseClass) : 
    def __init__ (self) : 
     BaseClass.__init__(self) 
     self.Dict['class0'] = 0 

class Class1 (BaseClass) : 
    def __init__ (self) : 
     BaseClass.__init__(self) 
     self.Dict['class1'] = 1 

c0 = Class0() 
c1 = Class1() 

print c0.Dict 
print c1.Dict 

回答

9

你碰到一個python gotcha:可變默認參數。

http://blog.objectmentor.com/articles/2008/05/22/pythons-mutable-default-problem

class BaseClass : 
    def __init__ (self, _dict=None) : 
     self.Dict = _dict or {} 
+0

大聲笑,我沒想到這一點。我幾乎把我的頭髮拉出來試圖弄清楚我的程序中出現了一些奇怪的副作用。謝謝! – rectangletangle 2011-05-14 23:08:35

+0

另外,您發佈的修復程序修復了此問題。感謝您的快速回復。 – rectangletangle 2011-05-14 23:34:21

+1

是的,我覺得你打了那個,就是跆拳道? (幾個小時後)該死的,好的... – peufeu 2011-05-14 23:51:13