首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python中的对象变量有多少内存副本?

Python中的对象变量有多少内存副本?
EN

Stack Overflow用户
提问于 2015-01-30 06:38:25
回答 1查看 380关注 0票数 14

我最近对蟒蛇很陌生。以前,我所有的编程知识都局限于Java。在这里,我有一个关于Python中的对象变量的问题。我知道Python中的对象变量共享类实例。例如。

代码语言:javascript
复制
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的静态类变量,这两个概念是相同的还是不同的?如果不一样,他们之间有什么区别?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-30 06:47:25

在python中,类作用域中声明的任何内容实际上都是全局的。当您在实例上查找该属性时,python没有找到它,因此它会查看该类(然后继续查看基类,一直到方法解析顺序)。因此,在您的示例中,x.listA.list完全相同,因为没有附加到x的实例属性list。类似地,y.listA.list相同,因此x.listy.list引用相同的底层列表。(哎呀!)

据我所知,这至少与Java的静态类似(尽管我在Java方面不够流利,无法确切地说出有多相似)。

将属性与类分离的典型方法是将该属性绑定到实例(通常在__init__中):

代码语言:javascript
复制
class A(object):
    def __init__(self):
        self.list = []

在上面的示例中,self是实例,它被传递(隐式)到任何‘普通’方法(包括“魔术”方法,如__init__)。

现在,如果再做一次实验,您将看到x.list的值为[1, 3],而y.list现在是[2, 4]

现在是测试。如果你在这节课上做实验会发生什么?

代码语言:javascript
复制
class A(object):
    list = []
    def __init__(self):
        self.list = []

答:x.list = [1, 3]y.list = [2, 4]。原因是,当python执行x.list时,它首先查看实例(在查看类之前)。由于在实例中找到了一个名为list的属性,所以使用的属性就是该属性。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28230498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档