这是一段代码:
>>> class A(object):
... value = []
... def method(self, new_value):
... self.value.append(new_value)
...
>>> a = A()
>>> a.value
[]
>>> a.method(1)
>>> b = A()
>>> b.value
[1]
>>> b.method(2)
>>> b.value
[1, 2]
>>> a.value
[1, 2]
仅在列表中发生这种情况。唯一的方法是在__init__中定义值吗? 如何在python中正常定义默认类值?
UPD
感谢您的回复
>>> class B(object):
... value = "str"
... def method(self):
... self.value += "1"
...
>>> a = B()
>>> a.value
'str'
>>> a.method()
>>> a.value
'str1'
>>> b = B()
>>> b.value
'str'
我不明白,为什么列表是共享的但str不是?
答案 0 :(得分:8)
您定义的value
不是您的类的实例字段,更像是静态字段。但是python不介意你从实例访问这个字段。因此,即使您从实例访问此字段,它也不是每个实例的不同列表。基本上,每次调用方法时,您都会附加到同一个列表中。
你必须这样做
class A(object):
def __init__(self):
self.value = []
def method(self, new_value):
self.value.append(new_value)
现在,您为每个实例创建了一个不同的列表。
编辑:让我试着解释一下使用str
时会发生什么。
class A(object):
self.value = 'str'
def method(self):
self.value += '1'
上一段代码中的最后一行与此相同:
self.value = self.value + '1'
现在,这使得它更容易看到发生了什么。首先,python得到了
来自self.value
的价值。由于self
尚未定义实例字段,
这将给'str'
。添加'1'
并将其设置为实例字段
叫value
。这就像
self.value = 'str1'
与您在__init__
方法中设置实例字段相同(在我的
第一段代码。)
self.value = []
这是否说清楚了?
答案 1 :(得分:5)
在value
中定义__init__()
。没有其他方法可以定义实例属性。
在实例方法外部绑定的属性是类属性,并由该类的所有实例共享。因此,绑定到类属性的对象的修改会影响类的所有实例,正如您在示例中所注意到的那样。