这是一个代码:
>>> 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]
Run Code Online (Sandbox Code Playgroud)
这只发生在列表中.是__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'
Run Code Online (Sandbox Code Playgroud)
我不明白,为什么列表是共享但str不是?
将value要定义不是你的类,它更像是一个静态字段的实例字段.但是python不介意你从实例访问这个字段.因此,即使您从实例访问此字段,它也不是每个实例的不同列表.基本上,每次调用方法时,您都会附加到同一个列表中.
你必须这样做
class A(object):
def __init__(self):
self.value = []
def method(self, new_value):
self.value.append(new_value)
Run Code Online (Sandbox Code Playgroud)
现在,您为每个实例创建了一个不同的列表.
编辑:让我试着解释当你使用a时会发生什么str.
class A(object):
self.value = 'str'
def method(self):
self.value += '1'
Run Code Online (Sandbox Code Playgroud)
上一代码中的最后一行与此相同:
self.value = self.value + '1'
Run Code Online (Sandbox Code Playgroud)
现在,这使得它更容易看到正在发生的事情.首先,python从中获取值self.value.由于尚未定义实例字段self,因此这将给出'str'.添加'1'到该文件并将其设置为名为的实例字段value.这就像
self.value = 'str1'
Run Code Online (Sandbox Code Playgroud)
这与您在__init__方法中设置实例字段相同(在我的第一段代码中).
self.value = []
Run Code Online (Sandbox Code Playgroud)
这清楚了吗?
value在中定义__init__()。没有其他方法可以定义实例属性。
绑定在实例方法外部的属性是类属性,并且由该类的所有实例共享。因此,如您在示例中所注意到的,对绑定到类属性的对象的修改会影响该类的所有实例。