Python中的对象变量有多少个内存副本?

时间:2015-01-30 06:38:26

标签: java python

我最近是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的静态类变量一样,这两个概念是相同还是不同?如果不同,他们之间有什么区别?

1 个答案:

答案 0 :(得分:1)

在python中,在类范围内声明的任何内容都是有效的全局。当你在实例上查找该属性时,python找不到它,因此它会在类上查找(然后它继续在方法解析顺序上查看基类)。因此,在您的情况下,x.listA.list完全相同,因为list没有附加实例属性x。类似地,y.listA.list相同,因此x.listy.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的属性,因此就是使用的属性。