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.list
与A.list
完全相同,因为没有实例属性list
附加到x
。同样,y.list
与A.list
相同,因此x.list
和y.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中的对象变量有多少个内存副本? [复制]的主要内容,如果未能解决你的问题,请参考以下文章