2013-02-07 2 views
0

ID가 키이고 클래스가 사전 인 항목이 있습니다. 특정 클래스의 변수에 추가하려고하면 사전의 다른 모든 클래스도 추가됩니다.Python 사전 값을 추가하는 클래스는 모든 사전 항목에 할당합니다.

class Reaction: 
    def __init__(self, bkm_id, ec_nums = [], b_ids = [], k_ids = [], m_ids = [], source = ''): 
     self.bkm_id = bkm_id 
     self.ec_nums = ec_nums 
     self.b_ids = b_ids 
     self.k_ids = k_ids 
     self.m_ids = m_ids 
     self.source = source 

     self.substrates = [] 
     self.products = [] 

    def add_metabolite(self, metabolite, stoichiometry, subs_prod): 
     if subs_prod == 'S': 
      self.substrates.append(Substrate_Product(metabolite, stoichiometry)) 
     elif subs_prod == 'P': 
      self.products.append(Substrate_Product(metabolite, stoichiometry)) 

은 클래스를 정의합니다. 그런 다음 입력하면 :

rxna = Reaction('a') 

rxnb = Reaction('b') 

dict = {} 

dict['a'] = rxna 

dict['b'] = rxnb 

dict 
Out[14]: 
{'a': <__main__.Reaction instance at 0x102c51fc8>, 
'b': <__main__.Reaction instance at 0x102c62518>} 

dict['a'].b_ids.append('BID') 

dict['a'].b_ids 
Out[16]: ['BID'] 

dict['b'].b_ids 
Out[17]: ['BID'] 

rxnb.b_ids 
Out[18]: ['BID'] 

나는 단지 'BID'를 rxna.b_ids에 추가하려고합니다. 나는 명백한 것을 놓치고 있는가?

답변

2

이 목록은 클래스 정의에서 한 번 만들어 지므로 모든 인스턴스에서 공유됩니다. 당신은 원 : 당신이 인수 기본값으로 변경 가능한 객체를 사용하지 않을 이유

class Reaction: 
    def __init__(self, bkm_id, ec_nums=None, b_ids=None, k_ids=None, m_ids=None, source = '') 
     self.bkm_id = bkm_id 
     self.ec_nums = ec_nums 
     self.b_ids = b_ids or [] 
     self.k_ids = k_ids or [] 
     self.m_ids = m_ids or [] 
     self.source = source 

     self.substrates = [] 
     self.products = [] 

    def add_metabolite(self, metabolite, stoichiometry, subs_prod): 
     if subs_prod == 'S': 
      self.substrates.append(Substrate_Product(metabolite, stoichiometry)) 
     elif subs_prod == 'P': 
      self.products.append(Substrate_Product(metabolite, stoichiometry)) 

이것은 (물론, 당신이 좋은 이유가없는 한).

+0

감사합니다. 꿈 같은 작품 (좋은 꿈)! –

+1

효과가있는 경우이 대답을 "수락 함"으로 표시하십시오. –

관련 문제