gpt4 book ai didi

python - 为类变量赋值是为该对象的所有实例赋值

转载 作者:太空宇宙 更新时间:2023-11-04 11:01:22 28 4
gpt4 key购买 nike

我有一个带字典的类(class)。

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

当我在该字典中的键上 += 值时,它会反射(reflect)在我从该对象实例化的每个对象中。

如何使该字典对于该类的每个实例都是唯一的?

这是我创建对象的方式:

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。

即使 Fleet 对象位于内存中的不同位置,也会发生这种情况。

我必须传入另一个类的字典吗?我写了一个测试类来验证这一点:

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 = {}

关于python - 为类变量赋值是为该对象的所有实例赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4929969/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com