Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 默认类参数是为所有类实例共享的,为什么?_Python_Python 2.7 - Fatal编程技术网

Python 默认类参数是为所有类实例共享的,为什么?

Python 默认类参数是为所有类实例共享的,为什么?,python,python-2.7,Python,Python 2.7,可能重复: 我只是在玩python,偶然发现了一些让我困惑的东西 为什么下面代码中的t1和t2共享同一个决策字典?我得写信 t1=Decision({},txt1="Test1",txt2="Response Test1") 而不是 t1=Decision(txt1="Test1",txt2="Response Test1") 让他们每人都有一个。为什么? 如果Python2.7很重要的话,我会使用它 class Decision(object): def __init__(sel

可能重复:

我只是在玩python,偶然发现了一些让我困惑的东西

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

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

t1=Decision(txt1="Test1",txt2="Response Test1")
让他们每人都有一个。为什么?

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

因为创建空dict的def(inition)行是在定义方法时计算的,而不是在调用方法时计算的

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