关于Java:Python中的对象变量有多少内存副本?

How many memory copies do object variables in Python have?

本问题已经有最佳答案,请猛点这里访问。

我最近刚接触过python。以前我所有的编程知识都局限于Java。这里我有一个关于Python中对象变量的问题。我知道Python中的对象变量共享类实例。例如。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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的静态类变量,这两个概念是相同的还是不同的?如果不同,他们之间有什么区别?


在Python中,在类范围内声明的任何内容都是有效的全局性的。当您在一个实例上查找该属性时,python找不到它,所以它会在该类上查找(然后它会一直在方法解析顺序上查找基类)。因此,在您的例子中,x.listA.list完全相同,因为x没有实例属性list。同样,y.listA.list相同,所以x.listy.list指的是相同的基础清单。(呸!)

正如我所理解的,这至少与Java的静态类似(虽然我在Java中不够流利,不能说完全相同)。

将属性与类分离的典型方法是将该属性绑定到实例(通常在__init__中):

1
2
3
class A(object):
    def __init__(self):
        self.list = []

在上面的例子中,self是实例,它被(隐式地)传递给任何"普通"方法(包括像__init__这样的"魔法"方法)。

如果你再做一次实验,你会发现x.list的值是[1, 3]y.list的值是[2, 4]

现在进行测试。如果你在这节课上做实验会怎么样?

1
2
3
4
class A(object):
    list = []
    def __init__(self):
        self.list = []

答:x.list = [1, 3]y.list = [2, 4]。原因是,当python执行x.list时,它首先查看实例(在查看类之前)。因为在实例上找到了一个名为list的属性,这就是所使用的属性。