我發現奇怪的Python行爲(或者我不明白屬性的繼承和/或默認值是如何工作的)。Python:變量的新實例未在類的新實例中創建
對於給定的代碼
class A(object):
def __init__(self, s):
self.s = s
print "in init", self.s
class B(A):
def __init__(self, s = set()):
super(B, self).__init__(s)
print "after super", self.s
self.s.add('foo')
print '--------------'
if __name__ == "__main__":
a = B()
b = B()
我得到以下輸出:
in init set([])
after super set([])
--------------
in init set(['foo']) # Why it has value set in other object?!
after super set(['foo'])
--------------
當然期望的行爲將是一個空集,以初始化self.s在第二物體(b)中,但對於它從以前的對象獲取狀態的未知原因。爲什麼會發生?如何獲得所需的行爲?
謝謝!
http://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default-argument – 2013-03-11 16:20:32
非常感謝您!這真的很有說服力! – radious 2013-03-11 16:28:50