java 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的静态类变量一样,这两个概念是相同的还是不同的?如果不同,它们之间有什么区别
# 1 楼答案
在python中,在类范围内声明的任何内容实际上都是全局的。当您在实例上查找该属性时,python没有找到它,因此它会查找该类(然后继续查找基类,直到方法解析顺序)。因此,在您的例子中,
x.list
与A.list
完全相同,因为没有实例属性list
附加到x
。类似地,y.list
与A.list
相同,因此x.list
和y.list
指的是相同的基础列表。(呸!)据我所知,这至少与Java的静态语言类似(尽管我对Java不够流利,不能准确地说如何类似)
解除属性与类关联的典型方法是将该属性绑定到实例(通常在
__init__
):在上面的例子中,
self
是实例,它被(隐式地)传递给任何“普通”方法(包括像__init__
这样的“神奇”方法)现在如果你再做一次实验,你会看到
x.list
取[1, 3]
的值,而y.list
现在是[2, 4]
现在是测试。如果你在这门课上做实验会怎么样
回答:
x.list = [1, 3]
和y.list = [2, 4]
。原因是,当python执行x.list
时,它首先查看实例(在查看类之前)。因为在实例上找到了名为list
的属性,所以使用了该属性