2017-04-21 1 views
0

인스턴스의 클래스의 컨텐츠 인스턴스가 참조 용 매개 변수로 전달 된리스트를 리턴하는 메소드를 작성하려고합니다. 목록의 모든 요소 (인스턴스)는 사전 인 속성 (인스턴스 변수)을 가지며 각 요소마다 내용이 달라야합니다. 문제는 사전에 올바른 내용으로 인스턴스가 제대로 만들어 졌을 때도 마찬가지입니다. , 반환 될 목록에 추가 될 때 목록에있는 인스턴스의 모든 사전 (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

'self.attrs = attrs' 복사하지 않는 데이터. 모든 인스턴스는 동일한'attrs' dict를 사용하고 있습니다. 왜냐하면 각 인스턴스에 대해 동일한 dict으로'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))