Python:改变一个对象的数据会改变另一个对象

2024-06-16 18:12:51 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我的解释不够连贯,我提前道歉。我对python和代码还不熟悉。我目前正在尝试创建一个Pokemon程序,允许2个用户互相攻击。moveList是一个全局列表,包含游戏中所有可能的移动。 x-存储pokemon移动的索引的文件。pokeData.loadMoves在每个pokemon中加载一个预先存在的move数组,其中包含4个move对象。当我第一次加入阿卡宁的4个动作时,它是好的。然而,当我加上埃维的动作,它重写了阿卡宁的动作。我已经花了大约40分钟试图弥补这一点,但毫无结果。你知道吗

分离对象:

P1 = None
P2 = None

loadGame()

P1 = inputPokemon('player1')
P2 = inputPokemon('player2')

功能:

for x in file.readlines():
    x = x.split(' ')
    if(x[0].strip().lower() == string):

        i =int(x[1])-1
        j =int(x[2])-1
        k =int(x[3])-1
        l =int(x[4])-1

        if(second == True):
            print("Arcanine's moves before loading eevee")
            for x in range(4):
                print(P1.move[x].name)

        pokeData.loadMoves(moveList[i],moveList[j],moveList[k],moveList[l])
        print("Load %s's moves " %x)

        if(second == True):
            print("Arcanine's moves after loading eevee")
            for x in range(4):
                print(P1.move[x].name)

加载移动:

move=['','','','']
def loadMoves(self, move1, move2, move3, move4):
    self.move[0] = move1
    self.move[1] = move2
    self.move[2] = move3
    self.move[3] = move4

输出:

player2, please choose your Pokemon: Eevee
Loading moves for eevee
Arcanine's moves before loading eevee
['takedown']
['growl']
['flamethrower']
['confuseray']
Load 3's moves 
Arcanine's moves after loading eevee
['watergun']
['doubleteam']
['shockwave']
['tackle']

Tags: inselfformoveifintprint动作
1条回答
网友
1楼 · 发布于 2024-06-16 18:12:51

罪魁祸首是类变量move。将该列表设置为类变量意味着所有实例都将指向同一列表对象。考虑以下几点:

>>> class T:
...    move = [] # move defined as class variable
...    def update(self, v):
...        self.move[0:] = v
...
>>> c = T()
>>> c.move
[]
>>> d = T()
>>> d.update([1,2,3])
>>> c.move
[1, 2, 3]  # updates in d are seen in c
>>> c.update([4,5,6])
>>> d.move
[4, 5, 6]  # updates in c are equally seen in d

您应该考虑在类的实例上设置move,即在类的__init__中。因此,列表绑定到每个实例,而不是类本身:

class T:
    def  __init__(self):
       self.move = ['','','','']

相关问题 更多 >