Установка атрибута класса для экземпляра устанавливает его для всех экземпляров - PullRequest
0 голосов
/ 30 января 2020

У меня есть класс с именем SalesSimulator, у которого есть атрибут с именем common_params, который является диктатом. Он содержит ключ с именем number_agents, который указывает на целочисленное значение.

Значения dict имеют значения, которые извлекаются во время процедуры ` init 'из другого файла, называемого SimulatorObjects, который содержит значения по умолчанию, передаваемые в SalesSimulator.

Пользователь класса может проверить этот атрибут и при необходимости изменить значение по умолчанию на собственное предпочтение. Это все работает хорошо. Что я нахожу странным, так это то, что если я создаю один экземпляр класса и устанавливаю новое значение для одного из элементов в атрибуте common_params, то это значение распространяется на все будущие экземпляры класса.

Например:

ss = SalesSimulator()
print(ss.common_params['number_agents'])
ss.common_params['number_agents'] =  10
print(ss.common_params['number_agents'])

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

new_ss = SalesSimulator () print (new_ss.common_params ['number_agents'])

Я ожидал, что для нового экземпляра классифицирует значение go обратно в 1, которое является значением по умолчанию, которое вызывается во время конструктора SalesSimulator.

Вот соответствующая часть этого конструктора:

import SimulatorObjects as so #this is my file of default values
class SalesSimulator(object):

    def __init__(self):
        # some other stuff happens here that is not relevant
        # set default parameters
        self.common_params = so.common_params

Элемент в файле SimulatorObject выглядит следующим образом:

common_params = {'number_agents': 1,
                 'other_stuff': [],
                 'some_factor': 1.4}

Кажется, я могу обойти Задача:

self.common_params = copy.deepcopy(so.common_params)

Это приемлемое решение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...