Словарь 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. Мне что-то не хватает?

0
nl ja de

1 ответы

Эти списки создаются один раз, по определению класса и, следовательно, совместно используются всеми экземплярами. Вы хотели:

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

Вот почему вы никогда не используете изменяемые объекты в качестве аргументов по умолчанию (ну, если у вас нет веской причины).

2
добавлено
Если это сработает для вас, отметьте этот ответ как «принятый», пожалуйста.
добавлено автор Clemens Klein-Robbenhaar, источник
Спасибо, работает как сон (хороший сон)!
добавлено автор Will Bryant, источник
Python
Python
7 654 участник(ов)

Уютный чат для профессионалов, занимающихся поиском питоньих мудростей. Как не получить бан: https://t.me/ru_python/577926

Python beginners
Python beginners
4 449 участник(ов)

Вопросы про Python для чайников. Cпам и троллинг неприемлем. Не злоупотребляйте стикерами. Частозадаваемые вопросы: https://github.com/ru-python-beginners/faq/blob/master/README.md Статистика тут: https://grstats.me/chat/x4qym2k5uvfkr3al6at7

pro.python
pro.python
1 090 участник(ов)

Сообщество разработчиков под Python Создатель: @rodgelius

Rude Python
Rude Python
971 участник(ов)

Python без „девочек”, здесь матерятся и унижают Django. Not gay friendly. Правила: t.me/rudepython/114107 @rudepython | t.me/rudepython

rupython
rupython
509 участник(ов)

Группа создана с целью оперативного получения ответов на возникающие вопросы по разработке на яп python, смежные темы, а также человеческого общения. Приветствую!

Python-programming
Python-programming
266 участник(ов)

Чат группы вконтакте https://vk.com/python_community