我最近对蟒蛇很陌生。以前,我所有的编程知识都局限于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的静态类变量,这两个概念是相同的还是不同的?如果不一样,他们之间有什么区别?
发布于 2015-01-30 06:47:25
在python中,类作用域中声明的任何内容实际上都是全局的。当您在实例上查找该属性时,python没有找到它,因此它会查看该类(然后继续查看基类,一直到方法解析顺序)。因此,在您的示例中,x.list与A.list完全相同,因为没有附加到x的实例属性list。类似地,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的属性,所以使用的属性就是该属性。
https://stackoverflow.com/questions/28230498
复制相似问题