首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python类中的列表在2个不同的实例上共享相同的对象?

在Python类中的列表在2个不同的实例上共享相同的对象?
EN

Stack Overflow用户
提问于 2010-05-03 17:25:45
回答 4查看 8.7K关注 0票数 8

我创建了一个类:

代码语言:javascript
复制
class A:
    aList = []

现在我有了实例化这个类并将项添加到aList中的函数。

注:有2项

代码语言:javascript
复制
for item in items:
    a = A();
    a.aList.append(item);

我发现第一个A和第二个A对象的aList中有相同数量的项。我期望第一个A对象在它的列表中有第一个项目,第二个A对象在它的aList中有第二个项目。

有人能解释一下这是怎么发生的吗?

PS:

我设法通过在构造函数中移动aList来解决这个问题:

代码语言:javascript
复制
def __init__(self):
    self.aList = [];

但是我仍然对这种行为感到好奇。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-05-03 17:36:28

您已经将该列表定义为一个类属性。

类属性由类的所有实例共享。当您在__init__中将列表定义为self.aList时,该列表就是您的实例(self)的一个属性,然后一切就会按您所期望的那样工作。

票数 12
EN

Stack Overflow用户

发布于 2010-05-03 17:36:09

您混淆了类变量和对象变量。

如果您需要对象:

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

在您的示例中,静态是一个类变量,您可以将其与在其他语言中使用‘aList’关键字进行比较。当然,类变量在所有实例之间是共享的。

票数 4
EN

Stack Overflow用户

发布于 2011-09-22 09:25:14

这是因为list是一个可变对象,它只在定义类时创建一次,这就是为什么当您创建两个实例时它变得共享的原因。例如,

代码语言:javascript
复制
class A:
    a = 0 #immutable
    b = [0] #mutable

a = A()
a.a = 1
a.b[0] = 1

b = A()
print b.a #print 0
print b.b[0] #print 1, affected by object "a"

因此,为了解决这个问题,我们可以像你提到的那样使用构造函数。当我们将列表放入构造函数时,每当对象被实例化时,新的列表也会被创建。

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

https://stackoverflow.com/questions/2757116

复制
相关文章

相似问题

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