我想创建一个方法,该方法返回一个列表,该列表将实例类的内容实例作为参数传递。列表中的每个元素(一个实例)都有一个属性(实例变量),它是一个字典,每个元素的内容必须不同,问题在于,即使在字典中使用正确的内容正确创建了实例,当它们被附加到要返回的列表中时,列表中实例的所有词典(attrs)都会获得相同的内容。
这是代码
class ModelManager():
def get_subset(self, entity_class, condition_string, persistant):
entity_subset=[]
entity_attrs={}
entity_attrs_list=[]
attrs_list=[]
record_list=persistant.get_subset(entity_class, condition_string, persistant)
i=0
for record in record_list:
if i==0:
for data in record:
attrs_list.append(data)
elif i>1:
j=0
for data in record:
entity_attrs[attrs_list[j]]=data
j=j+1
new_instance=entity_class.clone()
new_instance.set_attrs(entity_attrs)
entity_subset.append(new_instance)
print(new_instance.attrs) #first print
i=i+1
for entity in entity_subset:
print(entity.attrs) #second print
return(entity_subset)
class Company(Entity):
def clone(self):
company=Company()
return company
class Entity:
def __init__(self):
self.attrs={}
def set_attrs(self, attrs):
self.attrs=attrs
这就是结果。
MacBook-Pro-de-Hugo:oop01 hvillalobos$ virtual/bin/python3 oop01.py
{'id': '1', 'razon_social': 'Attractora S.A. de C.V.', 'rfc': 'xxxxxxxx'}
{'id': '2', 'razon_social': 'Otra empresa sa de cv', 'rfc': ' yyyyyyyy'}
{'id': '3', 'razon_social': 'Una mas sa de vc', 'rfc': ' zzzzz'}
{'id': '3', 'razon_social': 'Una mas sa de vc', 'rfc': ' zzzzz'}
{'id': '3', 'razon_social': 'Una mas sa de vc', 'rfc': ' zzzzz'}
{'id': '3', 'razon_social': 'Una mas sa de vc', 'rfc': ' zzzzz'}
是否有人知道为什么列表中的所有元素最后都有相同的内容? 谢谢大家
答案 0 :(得分:0)
您当前的代码无法按照您希望的方式运行,因为您正在为所有实例重复使用相同的字典。因为您不断修改该字典的内容,最终结果是您创建的所有实例都具有属于最后一个实例的数据。
您可以通过几种方式解决此问题。最简单的方法是将字典的创建移动到循环中。另一种选择是在您创建字典后为每个实例分配字典副本。但我认为最优雅的解决方案是更改代码以使用数据填充字典,以便您同时创建新字典。
尝试替换此代码:
j=0
for data in record:
entity_attrs[attrs_list[j]]=data
j=j+1
使用:
entity_attrs = dict(zip(attrs_list, record))