为类变量赋值会影响该对象的所有实例
我有一个类,这个类里面有一个字典。
我创建了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 = {}