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

2022-09-04 23:21:06

我最近是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]

所以我的问题是有多少个内存副本?只有 1 个或与实例数量一样多?python中的对象变量共享行为就像Java的静态类变量一样,这两个概念是相同还是不同?如果不同,它们之间有什么区别?A.list


答案 1

在python中,在类范围内声明的任何内容实际上都是全局的。当您在实例上查找该属性时,python找不到它,因此它会查找该类(然后它继续查找基类,一直到方法解析顺序)。因此,在您的情况下,与 没有附加到 的实例属性完全相同。类似,与此相同,并引用相同的基础列表。(哎呀!x.listA.listlistxy.listA.listx.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 = []

答:和 .原因是因为当python这样做时,它首先查看实例(在查看类之前)。由于在实例上找到具有该名称的属性,因此该属性是使用的。x.list = [1, 3]y.list = [2, 4]x.listlist


答案 2