2017-04-21 56 views
0

我想創建一個方法,它返回一個列表,該列表將實例的類的內容實例作爲參數傳遞以供參考。列表(實例)中的每個元素都有一個屬性(實例變量),它是一個字典,每個元素的內容必須與每個元素不同,問題是,即使正確使用其字典中的正確內容創建實例,當它們被追加到要返回的列表中時,列表中的實例的所有字典(attrs)將獲得相同的內容。使用python中的對象列表

這是代碼

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

'self.attrs = attrs'不復制數據。你所有的實例都使用相同的'attrs'字典,因爲你對每個實例使用相同的字典來調用'set_attrs'。見https://nedbatchelder.com/text/names.html – user2357112

+2

'self.attrs = attrs.copy()'可以幫助 –

+0

任何改變任何可變對象的引用,將改變其所有引用。 – direprobs

回答

0

由於您對所有實例重用相同的字典,因此您當前的代碼無法按照您的方式工作。由於您不斷修改該字典的內容,最終的結果是您創建的所有實例都擁有應該屬於最後一個的數據。

您可以通過幾種方法解決此問題。最簡單的方法是將字典的創建移動到循環中。另一種選擇是在創建完字典之後爲每個實例分配一份字典副本。但我認爲最優雅的解決方案是更改代碼,以便用數據填充字典,以便同時創建新字典。

嘗試更換此代碼:

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

與:

entity_attrs = dict(zip(attrs_list, record)) 
相關問題