有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

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