【问题标题】:Python creating objects in a loop append items to same list instead of a new listPython在循环中创建对象将项目附加到同一个列表而不是新列表
【发布时间】:2020-03-26 02:42:35
【问题描述】:

我有一个在循环内创建对象的代码。该对象有一个包含不同类型对象的列表。

class A:
    a = ''
    def __init__(self):
        pass

class B:
    def __init__(self):
        pass
    list_of_A = list()

for i in range(3):
    _b = B()
    for j in range(2):
        _a = A()
        _b.list_of_A.append(_a)
    print(len(_b.list_of_A))

输出是: 2 4 6

我的预期是: 2 2 2

我尝试在内循环末尾删除_b。但是没有用。 我应该如何确保循环创建 B 的新对象。

【问题讨论】:

  • list_of_A = list() 移动到__init__ 并添加self.,即def __init__(self): self.list_of_A = list()。顺便说一句,list() 可以是 []

标签: python list loops object


【解决方案1】:

一种方法是将list_of_A 设为实例变量,这样每次创建对象时它都会创建新列表:

class B:
    def __init__(self):
        self.list_of_A = list()   # or = []

当你有以下安排时:

class B:
    def __init__(self):
        pass
    list_of_A = list()

list_of_A 由该类的所有对象共享(因为这是一个类变量),因此您要附加到同一个列表对象。

【讨论】:

    【解决方案2】:

    这样做:

    class B:
        def __init__(self):
            self.list_of_A = list()
    

    原因:类变量(或静态变量)与实例变量

    在您的代码中,list_of_A 是一个类变量(或静态变量),因此对于 B 类的所有对象(或实例)都是相同的。 在上面建议的代码中,list_of_A 是一个实例变量,因此对于 B 类的每个对象(或实例)而言,它是不同且唯一的。

    【讨论】:

      猜你喜欢
      • 2020-05-15
      • 1970-01-01
      • 2023-01-07
      • 1970-01-01
      • 2021-10-31
      • 2020-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多