Инстанцирующий класс сохраняет ссылки - PullRequest
3 голосов
/ 23 октября 2011

В Python я дважды создаю экземпляр класса и сохраняю их в 2 разных переменных. Почему второй объект содержит копию первого объекта? Я знаю, что это копия, потому что я изменяю значения в одном объекте, а другой - нет. Пример:

У меня есть следующий класс:

class HistoricalData:
    dataPoints = {}

Затем я создаю экземпляр класса и заполняю dataPoints значениями:

hd1 = HistoricalData()
hd1.dataPoints["channel1"] = 1
hd1.dataPoints["channel2"] = 2
hd1.dataPoints["channel3"] = 3

Затем я снова создаю экземпляр класса и снова заполняю его значениями:

hd2 = HistoricalData()
hd2.dataPoints["channel1"] = 10

Когда я печатаю значения из hd1.dataPoints и hd2.dataPoints, я получаю следующее:

{'channel1': 1, 'channel2': 2, 'channel3': 3}
{'channel1': 10, 'channel2': 2, 'channel3': 3}

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

Я думал, что когда вы создаете экземпляр класса, все значения по умолчанию будут соответствовать значениям, определенным в классе. Я что-то упустил?

1 Ответ

10 голосов
/ 23 октября 2011

Вы объявили class переменную , а не переменную экземпляра .

Переменные класса являются общими для всех экземпляров изclass.Это означает, что когда вы обновляете один HistoricalData object, вы обновляете их все.

Переменные экземпляра являются локальными для каждого экземпляра class.Обычно они инициализируются в специальном методе __init__(), который вызывается при создании каждого экземпляра .

Таким образом, вы, вероятно, должны инициализировать datapoints примерно такчтобы получить желаемый результат:

class HistoricalData(object):

    def __init__(self):
        self.dataPoints = {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...