Python中的对象变量有多少内存副本?
这个问题在这里已经有了答案:
在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
的属性在实例中找到,因此使用该属性。
上一篇: How many memory copies do object variables in Python have?