我最近刚接触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 的静态类变量一样,这两个概念是相同还是不同? 如果不同,它们之间有什么区别?
在python中,在类范围内声明的任何内容实际上是全局的。 当你在实例上查找该属性时,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
的属性,因此就是所使用的属性。