У меня есть класс со словарем.
Я создаю n числовых экземпляров класса.
Когда я + = значения для ключа в этом словаре отражается в каждом отдельном объекте, который я создал из этого объекта.
Как сделать этот словарь уникальным для каждого экземпляра этого класса?
Вот как я создаю объект:
for num in range(0, numOfPlayers):
listOfPlayerFleets.append(fleet.Fleet())
Вот как вызывается метод addShip. Я имею это в цикле for и проверил, что currentPlayer int увеличивается каждый раз.
listOfPlayerFleets[currentPlayer].addShip(typeOfShip, num)
Вот пример моего объекта флота ниже для примера.
class Fleet:
""" Stores Fleet Numbers, Represents a fleet """
shipNamesandNumber = {}
def addShip(self, type, numToAdd):
self.shipNamesandNumber[ships.shipTypesDict[type]['type']] += numToAdd
В pydev, когда я выполняю эту функцию, каждый объект с именем shipNamesandNumbers увеличивается с помощью numToAdd.
Это происходит даже в тех случаях, когда объекты флота находятся в разных местах памяти.
Должен ли я переходить в словарь из другого класса? Я написал тестовый класс, чтобы проверить это:
class Foo:
"""Testing class with a dictionary"""
myDictionary = {}
def __init__(self):
self.myDictionary = {'first':0, 'second':0}
def addItem(self, key, numToAdd):
self.myDictionary[key] += numToAdd
numOfFoos = 2
listOfFoos = []
for num in range(0, numOfFoos):
listOfFoos.append(Foo())
listOfFoos[0].addItem('first', 1)
listOfFoos[0].addItem('first', 2)
listOfFoos[1].addItem('first', 2)
print " This is the value of foo1 it should be 3"
print listOfFoos[0].myDictionary
print "This is the value of foo2 ot should be 2"
print listOfFoos[1].myDictionary
Класс Foo не имеет той же проблемы, что и мои объекты флота, имеющие все словари, модифицированные при изменении одного словаря.
Итак, это еще больше смутило меня.
Вы создали shipNamesandNumber
как атрибут класса, так как он содержался непосредственно внутри класса. Каждая мутация, даже через self
, мутирует один и тот же словарь. Если вы хотите предотвратить это, вы должны создать атрибут экземпляра, обычно в __init__()
:
class Fleet:
def __init__(self):
self.shipNamesandNumber = {}