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?
