为类变量赋值会影响该对象的所有实例

1 投票
1 回答
4555 浏览
提问于 2025-04-16 11:25

我有一个类,这个类里面有一个字典。

我创建了n个这个类的实例。

当我在字典的某个键上加值时,这个变化会在我创建的每一个对象中都反映出来。

我该怎么做才能让每个实例的字典都是独立的,不互相影响呢?

这是我创建对象的方式:

for num in range(0, numOfPlayers):
    listOfPlayerFleets.append(fleet.Fleet())

这是我调用addShip方法的方式。我在一个循环里这样做,并且确认每次currentPlayer的值都在增加。

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类没有像我的舰队对象那样的问题,所有字典在一个被修改时都会被修改。

所以这让我更加困惑了。

1 个回答

4

你把 shipNamesandNumber 创建成了一个 类属性,因为它直接放在了类里面。每次修改这个属性的时候,不管是通过 self 还是其他方式,都是在修改同一个字典。如果你想避免这种情况,就必须创建一个 实例属性,通常是在 __init__() 这个方法里:

class Fleet:
  def __init__(self):
    self.shipNamesandNumber = {}

撰写回答