为什么我的不同实例变量在python中链接在一起

2021-06-13 14:08:42 发布

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

我是python新手,所以我做了一些挖掘工作,据我所知,类的成员变量将在该类的所有实例中更新,而不管您使用哪个实例对其进行了修改。但是,在实例变量中似乎不应该发生同样的情况,但是当我运行这段代码时。。。你知道吗

class Game(object):

    def__init__(self, active_turn, board):
         self.active_turn = active_turn
         self.board = board


game = Game(1,[1,0,0,0,0,0,0,0,0])

move = 3

print(game.board, "\n")

possible_game = Game(game.active_turn*-1,game.board)

print(game.board)
print(possible_game.board, "\n")

possible_game.board[move] = possible_game.active_turn

print(game.board)
print(possible_game.board, "\n")

game.board[move+1] = game.active_turn

print(game.board)
print(possible_game.board)

我得到这个输出。。。你知道吗

[1, 0, 0, 0, 0, 0, 0, 0, 0] 

[1, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 0, 0, 0, 0, 0, 0, 0, 0] 

[1, 0, 0, -1, 0, 0, 0, 0, 0]
[1, 0, 0, -1, 0, 0, 0, 0, 0] 

[1, 0, 0, -1, 1, 0, 0, 0, 0]
[1, 0, 0, -1, 1, 0, 0, 0, 0]

board变量在Game类的每个实例中都在更新,即使我只在其中一个实例中更改它。有人知道为什么会这样吗?我能做些什么来避免它?你知道吗

谢谢你, 尼克

2条回答
网友
1楼 ·

创建这两个实例时使用的是相同的board,因此当其中一个实例更新电路板时,更改也会反映在另一个实例中。你知道吗

game = Game(1,[1,0,0,0,0,0,0,0,0]) # first instance - you create the board here
...
possible_game = Game(game.active_turn*-1,game.board) # second instance - you pass the same board (game.board) to the constructor 
网友
2楼 ·

使用^{}

>>> a = [1,2,3]
>>> from copy import copy
>>> b = copy(a)
>>> b
[1, 2, 3]
>>> b[1] = 5
>>> b
[1, 5, 3]
>>> a
[1, 2, 3]
>>>

编辑

要真正了解引擎盖下的内容,您应该了解Python DataModel。官方文件很容易理解。你知道吗

简而言之,list是Python中的mutable类型,这意味着如果将一个list对象赋给多个变量,它们实际上指向同一个list对象,因此更改其中一个会影响其他变量。你知道吗

另一方面,stringinttuple。。。是immutable数据类型。
如果赋值a=1,那么a=212是不同的int对象,也就是说1不是变成2,因为int是不可修改的。你知道吗

相关问题