Python在循环中创建对象时会将项附加到同一列表而不是新列表
我有一个在循环中创建对象的代码。对象有一个包含不同类型对象的列表Python在循环中创建对象时会将项附加到同一列表而不是新列表,python,list,loops,object,Python,List,Loops,Object,我有一个在循环中创建对象的代码。对象有一个包含不同类型对象的列表 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_o
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.
六,
我所期望的是:
2.
2.
二,
我尝试删除内部循环末尾的\u b
。但是没有起作用。
如何确保循环创建一个新的B对象。一种方法是将a的
list\u
作为一个实例变量,这样每次创建对象时它都会创建一个新列表:
class B:
def __init__(self):
self.list_of_A = list() # or = []
当您有以下安排时:
class B:
def __init__(self):
pass
list_of_A = list()
list\u of A
由该类的所有对象共享(因为这是一个类变量),因此您将附加到同一个list对象。一种方法是使list\u of A
成为一个实例变量,这样每次创建对象时它都会创建新的列表:
class B:
def __init__(self):
self.list_of_A = list() # or = []
当您有以下安排时:
class B:
def __init__(self):
pass
list_of_A = list()
该类的所有对象都共享一个列表(因为这是一个类变量),因此您将附加到同一个列表对象。执行以下操作:
class B:
def __init__(self):
self.list_of_A = list()
原因:类变量(或静态变量)与实例变量
在您的代码中,list\u of_A
是一个类变量(或静态变量),因此它对于类B的所有对象(或实例)都是相同的。
在上面建议的代码中,list\u of_A
是一个实例变量,因此它对于类B的每个对象(或实例)都是不同且唯一的。执行以下操作:
class B:
def __init__(self):
self.list_of_A = list()
原因:类变量(或静态变量)与实例变量
在您的代码中,list\u of_A
是一个类变量(或静态变量),因此它对于类B的所有对象(或实例)都是相同的。
在上面建议的代码中,list\u of_A
是一个实例变量,因此它对于类B的每个对象(或实例)都是不同的和唯一的。将list\u of_A=list()
移动到\u init\u
中,并预先添加self,即def\u init\u(self):self.list\u of_A=list()
。顺便说一句,list()
可以是[]
。将list\u of_A=list()
移动到\u of_A=list(),并预先结束self.
,即def\u init\u(self):self.list\u of A=list()
。顺便说一句,list()
可以是[]
。