在python中使用对象列表

时间:2017-04-21 19:35:12

标签: python list object

我想创建一个方法,该方法返回一个列表,该列表将实例类的内容实例作为参数传递。列表中的每个元素(一个实例)都有一个属性(实例变量),它是一个字典,每个元素的内容必须不同,问题在于,即使在字典中使用正确的内容正确创建了实例,当它们被附加到要返回的列表中时,列表中实例的所有词典(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'}

是否有人知道为什么列表中的所有元素最后都有相同的内容? 谢谢大家

1 个答案:

答案 0 :(得分:0)

您当前的代码无法按照您希望的方式运行,因为您正在为所有实例重复使用相同的字典。因为您不断修改该字典的内容,最终结果是您创建的所有实例都具有属于最后一个实例的数据。

您可以通过几种方式解决此问题。最简单的方法是将字典的创建移动到循环中。另一种选择是在您创建字典后为每个实例分配字典副本。但我认为最优雅的解决方案是更改代码以使用数据填充字典,以便您同时创建新字典。

尝试替换此代码:

j=0
for data in record:
    entity_attrs[attrs_list[j]]=data
    j=j+1

使用:

entity_attrs = dict(zip(attrs_list, record))