可能重複:
「Least Astonishment」 in Python: The Mutable Default Argument爲什麼python字典在我啓動一個新的類實例時會記住前一個實例的值?
我有一些很奇怪,當我試圖寫一個類象下面這樣。在第3行,我必須將newdata的新副本放到self.data中,否則,當我啓動一個新的類實例時,前一個的值仍然會被類記住。請參見下面的例子,請注意唯一的區別在代碼的兩個版本上線3
class Pt(object):
def __init__(self,newdata={}):
self.data=newdata.copy()
if self.data == {}:
self._taglist = []
else:
self._taglist = self.data.keys()
def add_tag(self,tag=None):
self.data[tag]={'x':[0,1,2,3,4]}
self._taglist.append(tag)
In [49]: pt = Pt()
In [50]: pt.add_tag('b')
In [51]: pt.add_tag('a')
In [52]: pt.data
Out[52]: {'a': {'x': [0, 1, 2, 3, 4]}, 'b': {'x': [0, 1, 2, 3, 4]}}
In [53]: pt2 = Pt()
In [54]: pt2._taglist
Out[54]: []
class Pt(object):
def __init__(self,newdata={}):
self.data=newdata
if self.data == {}:
self._taglist = []
else:
self._taglist = self.data.keys()
def add_tag(self,tag=None):
self.data[tag]={'x':[0,1,2,3,4]}
self._taglist.append(tag)
In [56]: pt = Pt()
In [57]: pt.add_tag('a')
In [58]: pt.add_tag('b')
In [59]: pt._taglist
Out[59]: ['a', 'b']
In [60]: pt2 = Pt()
In [61]: pt2._taglist
Out[61]: ['a', 'b']
In [62]: pt2.data
Out[62]: {'a': {'x': [0, 1, 2, 3, 4]}, 'b': {'x': [0, 1, 2, 3, 4]}}
我想第二種情況是因爲:兩個newdata和self.data參考到同一個對象(但是怎麼會發生這種情況,值應該從右向左而不是反向),所以當我使用「add_tag」方法更新self.data時,新數據也會更新。但是我認爲當我通過pt2 = Pt()啓動一個新實例時,新數據應該使用默認值({}),它是否仍然保留來自pt1的舊值?
你不應該使用可變對象作爲默認值。 – Keith