【问题标题】:Why is this Python class copying another class contents?为什么这个 Python 类会复制另一个类的内容?
【发布时间】:2010-04-21 15:24:31
【问题描述】:

我正在尝试理解 Python 中的一种陌生行为。

我有下一个 python 代码:

class IntContainer:

    listOfInts = []

    def __init__(self, initListOfInts):

        for i in initListOfInts:
            self.listOfInts.append(i)

    def printInts(self):

        print self.listOfInts

if __name__ == "__main__":

    intsGroup1 = [1,2,3,4]
    intsGroup2 = [4,5,6,7]

    intsGroups = [intsGroup1,intsGroup2]

    intsContainers = []

    for ig in intsGroups:
        newIntContainer = IntContainer(ig)
        intsContainers.append(newIntContainer)

    for ic in intsContainers:
        print ic.listOfInts

我希望得到类似的东西:

[1, 2, 3, 4]
[4, 5, 6, 7]

但我明白了:

[1, 2, 3, 4, 4, 5, 6, 7]
[1, 2, 3, 4, 4, 5, 6, 7]

我已经检查了下一个问题:

why is python reusing a class instance inside in function

还有很多 Python 参考资料,但我无法理解发生了什么。我认为与newIntContainer标识符重用有关,但我并不深入了解。

为什么 Python 似乎重用了新对象的最后一个引用,即使我已将它添加到永久列表中?我可以做些什么来解决这个问题?

谢谢 ;)

【问题讨论】:

    标签: python class variables


    【解决方案1】:

    由于您将listOfInts 设为class 变量,这就是self.listOfInts 正在访问的内容,无论self 实例可能是什么;因此,所有appends 都将进入相同列表。

    如果这不是您想要的,您需要将listOfInts 设为一个实例 变量,例如通过在__init__ 方法的开头指定self.listOfInts = []

    【讨论】:

    • 非常感谢...我来自 C++、PHP 和其他没有类共享变量(类变量)之类的东西...我只是以为我在定义一个常规对象参数(实例变量)...
    • 其实C++和PHP都有类(静态)字段。
    【解决方案2】:

    listOfInts 已被定义为类变量。

    类变量由类的所有实例共享。

    如果您想保存与类相关的状态(一个典型的例子是当您想知道创建的类的实例数时),此行为很有用。

    如果您希望 listOfInts 对于每个实例都是唯一的,那么您应该在 init 或类的其他方法中将其定义为 self.listOfInts

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-27
      • 1970-01-01
      • 1970-01-01
      • 2018-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多