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
...
但我想知道为什么。当我现在为什么不应该时,更容易记住不要这样做。