我最近是python的新手。以前我的所有编程知识都限于Java。所以我在这里有一个关于Python中对象变量的问题。我知道Python中的对象变量在类实例上共享。例如。
class A:
list=[]
y=A()
x=A()
x.list.append(1)
y.list.append(2)
x.list.append(3)
y.list.append(4)
print x.list
[1,2,3,4]
print y.list
[1,2,3,4]
所以我的问题是A.list
有多少个内存副本?只有1或只有实例数? python共享行为中的对象变量就像Java的静态类变量一样,这两个概念是相同还是不同?如果不同,他们之间有什么区别?
答案 0 :(得分:1)
在python中,在类范围内声明的任何内容都是有效的全局。当你在实例上查找该属性时,python找不到它,因此它会在类上查找(然后它继续在方法解析顺序上查看基类)。因此,在您的情况下,x.list
与A.list
完全相同,因为list
没有附加实例属性x
。类似地,y.list
与A.list
相同,因此x.list
和y.list
引用相同的基础列表。 (唷!)
据我所知,这至少与Java的静态相似(虽然我在Java中不够流利,无法准确地说出如何类似)。
将属性与类解除关联的典型方法是将该属性绑定到实例(通常在__init__
中):
class A(object):
def __init__(self):
self.list = []
在上面的示例中,self
是实例,它会(隐式)传递给任何“普通”方法(包括像__init__
这样的“魔术”方法。
现在,如果再次进行实验,您会发现x.list
的值为[1, 3]
而y.list
现为[2, 4]
。
现在测试。如果你在这门课上做实验会怎么样?
class A(object):
list = []
def __init__(self):
self.list = []
答案:x.list = [1, 3]
和y.list = [2, 4]
。原因是因为当python执行x.list
时,它首先查看实例 (在查看类之前)。由于在实例上找到名为list
的属性,因此就是使用的属性。