Присвоить значение переменной класса присваивает его для всех экземпляров этого объекта

1

У меня есть класс со словарем.

Я создаю 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 не имеет той же проблемы, что и мои объекты флота, имеющие все словари, модифицированные при изменении одного словаря.

Итак, это еще больше смутило меня.

Теги:
object
dictionary
global

1 ответ

4
Лучший ответ

Вы создали shipNamesandNumber как атрибут класса, так как он содержался непосредственно внутри класса. Каждая мутация, даже через self, мутирует один и тот же словарь. Если вы хотите предотвратить это, вы должны создать атрибут экземпляра, обычно в __init__():

class Fleet:
  def __init__(self):
    self.shipNamesandNumber = {}
  • 0
    @Ignacia о, хорошо, спасибо! Это исправило это! Я очень ценю вашу помощь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню