Python中的对象变量有多少个内存副本?
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
有多少个内存副本?只有一个还是和实例的数量一样多?Python中的对象变量共享行为就像Java的静态类变量,这两个概念是相同的还是不同的?如果不同,它们之间有什么区别?
admin 更改状态以发布 2023年5月23日
在Python中,任何在类作用域声明的内容都是全局有效的。当您在实例上查找该属性时,Python找不到它,然后它会在类上查找(然后继续在基类上查找,一直到方法解析顺序)。因此,在您的情况下,x.list
与A.list
是完全相同的,因为没有附加到x
的实例属性list
。同样,y.list
与A.list
相同,因此x.list
和y.list
指向相同的基础列表。(呼!)
据我了解,这至少类似于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
的属性,因此使用该属性。