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

Posted

技术标签:

【中文标题】Python中的对象变量有多少个内存副本? [复制]【英文标题】:How many memory copies do object variables in Python have? [duplicate] 【发布时间】:2015-03-29 14:39:08 【问题描述】:

我最近刚接触 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】:

在 python 中,在类范围内声明的任何内容实际上都是全局的。当您在 instance 上查找该属性时,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 的属性,因此使用了该属性。

【讨论】:

以上是关于Python中的对象变量有多少个内存副本? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 变量类型 保存内存中的位置 和 引用

类和动态内存分配

Python中的赋值(复制)浅拷贝与深拷贝

具有共享对象引用的两个变量的总大小是多少? [复制]

并发编程之美

数组和对象的深拷贝