当前位置: 首页 > 知识库问答 >
问题:

如何避免在实例之间共享类数据?

西门淮晨
2023-03-14

我要的是这种行为:

class a:
    list = []

x = a()
y = a()

x.list.append(1)
y.list.append(2)
x.list.append(3)
y.list.append(4)

print(x.list) # prints [1, 3]
print(y.list) # prints [2, 4]

当然,当我打印时真正发生的是:

print(x.list) # prints [1, 2, 3, 4]
print(y.list) # prints [1, 2, 3, 4]

显然,它们在类A中共享数据。我如何获得单独的实例来实现我想要的行为?

共有2个答案

呼延曜灿
2023-03-14

被接受的答案是有效的,但多一点解释也无伤大雅。

创建实例时,类属性不会成为实例属性。当为它们赋值时,它们将成为实例属性。

在原始代码中,在实例化后没有为list属性赋值;因此它仍然是一个类属性。在__init__定义列表是有效的,因为__init__是在实例化之后调用的。或者,此代码也会产生所需的输出:

>>> class a:
    list = []

>>> y = a()
>>> x = a()
>>> x.list = []
>>> y.list = []
>>> x.list.append(1)
>>> y.list.append(2)
>>> x.list.append(3)
>>> y.list.append(4)
>>> print(x.list)
[1, 3]
>>> print(y.list)
[2, 4]

然而,问题中令人困惑的场景绝不会发生在数字和字符串等不可变对象上,因为不赋值就无法更改它们的值。例如,一个类似于原始的带有字符串属性类型的代码可以正常工作,没有任何问题:

>>> class a:
    string = ''


>>> x = a()
>>> y = a()
>>> x.string += 'x'
>>> y.string += 'y'
>>> x.string
'x'
>>> y.string
'y'

因此总结一下:类属性成为实例属性的条件是且仅当在实例化之后为它们赋值,无论是否在__init__方法中。这是一件好事,因为通过这种方式,如果在实例化之后从未为属性赋值,则可以拥有静态属性。

苏鸿才
2023-03-14

你想要这个:

class a:
    def __init__(self):
        self.list = []

在类声明中声明变量使它们成为“类”成员,而不是实例成员。在__init__方法中声明它们可以确保在对象的每个新实例旁边创建成员的新实例,这就是您要查找的行为。

 类似资料:
  • 问题内容: 我想要的是这种行为: 当然,当我打印时真正发生的是: 显然,他们在课堂上共享数据a。如何获得单独的实例以实现所需的行为? 问题答案: 在类声明中声明变量会使它们成为”class”成员,而不是实例成员。在方法中声明它们可以确保在对象的每个新实例旁边创建一个新的成员实例。

  • 问题内容: 我在JVM(Scala)中构建了一个庞大的图形,我想反复使用它来调整算法。我不想每次都从磁盘重新加载它。有没有办法让它坐在一个JVM中,而又与另一个正在开发算法的JVM连接呢? 问题答案: 将图形保存到磁盘,然后使用MappedByteBuffer将其映射到内存。两个进程应使用相同的内存,该内存将与页面缓存共享。

  • 我需要将xml转换为jpa实体。我已经使用jaxb获取了我的DTO,并使用mapstruct将dto转换为实体。但是,我需要从数据中提取一些数据,并将其设置为实体上的列表。我的映射器如下所示 我不知道如何在提取MetaData方法中访问我的实体特别。

  • 问题内容: 我有2个android应用程序,它们共享其95%的资源,布局,字符串等。只有几个jpg有所不同。 如何在不同的Eclipse Android项目之间共享资源,以避免资源重复? 问题答案: Eclipse提供了两种方法 创建一个库项目并将此库项目包含在两个应用程序项目中 创建一个共享源文件夹,转到您的项目属性,然后在“源”选项卡中,可以链接一个可能位于任何其他项目中的文件夹,并将这些文件

  • 问题内容: 在Java中的各个类之间共享数据的最佳方法是什么?我有一堆变量,它们由不同的类以不同的方式在不同的文件中使用。让我尝试说明问题的简化版本: 这是我之前的代码: 现在看起来像这样: 所以无论如何,我应该每次都传递x和y(其中x,y是存储在辅助类func中的变量)吗? 我的想法是要有一个特殊的容器类,其中存放x和y。顶级类将具有容器类的实例,并使用set方法更改x,y。 我的帮助程序类还将

  • 问题内容: 我一周前开始用python进行编码,这是我的错误,我很快就开始使用oops,类和对象进行编码。我以为我的C ++水平会有所帮助…。 令我惊讶的是,var和list都是一个全局变量,似乎在所有实例中都共享....我以为在所有实例中它都不同.....我花了半天的时间才弄清楚那....一点意义都没有,一个变量只能由一个类对象访问,而是在所有实例之间共享....只是好奇,它背后有原因吗???