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

在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 的属性,因此就是所使用的属性。

最新更新