首先,这没关系:
>>> class TestB():... def __init__(self, attr=1):... self.attr = attr... >>> a = TestB()>>> b = TestB()>>> a.attr = 2>>> a.attr2>>> b.attr1
但是,这仅适用于不可变(不变)类型。如果默认值是可变的(意味着可以替换),则将发生这种情况:
>>> class Test():... def __init__(self, attr=[]):... self.attr = attr... >>> a = Test()>>> b = Test()>>> a.attr.append(1)>>> a.attr[1]>>> b.attr[1]>>>
请注意,两者
a和
b都有共享属性。这通常是不需要的。
当类型可变时,这是定义实例变量默认值的Python方法:
>>> class TestC():... def __init__(self, attr=None):... if attr is None:... attr = []... self.attr = attr... >>> a = TestC()>>> b = TestC()>>> a.attr.append(1)>>> a.attr[1]>>> b.attr[]
我的第一段代码起作用的原因是,对于不可变的类型,Python会在需要时创建它的新实例。如果需要将1加1,Python会为您创建一个新的2,因为旧的1无法更改。我相信,原因主要是散列。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)