2012-03-29 68 views
0

可能重复:
“Least Astonishment” in Python: The Mutable Default ArgumentDictonary作为默认类参数为所有类实例共享,为什么?

我只是与蟒蛇玩耍和偶然的东西,让我困惑。

为什么下面的代码中的t1和t2共享相同的决策字典?我写的

t1=Decision({},txt1="Test1",txt2="Response Test1") 

代替

t1=Decision(txt1="Test1",txt2="Response Test1") 

为他们各有一个。为什么?

我使用Python 2.7,如果这是任何重要的。

class Decision(object): 
    def __init__(self,decisions={},txt1="",txt2=""): 
     self.decisions=decisions 
     self.txt1=txt1 
     self.txt2=txt2 
    def run(self): 
     if len(self.decisions)>0: 
      print self.txt1 
      print self.txt2 
      for i in self.decisions: print i + " - " + self.decisions[i][0] 
      ans="" 
      while True: 
       ans=raw_input("Enter answer: ") 
       if ans in self.decisions: break 
      if self.decisions[ans][1] is not None: self.decisions[ans][1].run() 


t1=Decision(txt1="Test1",txt2="Response Test1") 
t2=Decision(txt1="Test2",txt2="Response Test2")  

t1.decisions["yes1"]=("Yes","t2") 
t1.decisions["no1"]=("No","t3") 

t2.decisions["yes2"]=("Yes","t3") 
t2.decisions["no2"]=("No","t1") 

print t1.decisions 
<<<{'no2': ('No', 't1'), 'no1': ('No', 't3'), 'yes1': ('Yes', 't2'), 'yes2': ('Yes', 't3')} 
print t2.decisions 
<<<{'no2': ('No', 't1'), 'no1': ('No', 't3'), 'yes1': ('Yes', 't2'), 'yes2': ('Yes', 't3')} 

顺便说一句。我通过这样做解决了这个问题:

class Decision(object): 
    def __init__(self,decisions=None,txt1="",txt2=""): 
     if decisions==None:self.decisions={} 
     else:self.decisions=decisions 
     ... 

但我想知道为什么。当我现在为什么不应该时,更容易记住不要这样做。

回答

1

因为创建空字典的DEF(从头)线是在时间的方法是定义,而不是时间的方法是称为评价。

相关问题