0

ID をキーとして、クラスをエントリとして持つ辞書があります。ある特定のクラスの変数に追加しようとすると、辞書内の他のすべてのクラスも追加されます。

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 に追加したいだけでした。明らかな何かが欠けていますか?

4

1 に答える 1

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)) 

これが、変更可能なオブジェクトを引数のデフォルトとして決して使用しない理由です (正当な理由がない限り)。

于 2013-02-07T14:20:53.200 に答える