我是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类的每个实例中都在更新,即使我只在其中一个中更改它。有谁知道为什么会这样,我可以做些什么来避免它?
谢谢, 尼克
答案 0 :(得分:3)
当您创建两个实例时,您使用相同的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
答案 1 :(得分:3)
使用copy
>>> 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
类型,这意味着如果将列表对象分配给多个变量,它们实际上指向同一个列表对象,从而更改其中一个会影响他人。
另一方面,string
,int
,tuple
,...是immutable
数据类型。
如果您指定a=1
,则a=2
,1
和2
是不同的int对象,即1
不成为{{1}因为2
是不可变的,所以不能修改它们。