【问题标题】:Why are my different instance variables linking together in python为什么我的不同实例变量在 python 中链接在一起
【发布时间】:2014-10-10 21:55:41
【问题描述】:

我是 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 类的每个实例中都在更新,即使我只在其中一个实例中更改它。有谁知道为什么会发生这种情况以及我可以做些什么来避免它?

谢谢, 尼克

【问题讨论】:

    标签: python python-3.x linked-list instance member


    【解决方案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】:

      使用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 类型,这意味着如果将一个列表对象分配给多个变量,它们实际上指向的是同一个列表对象,因此更改其中一个会影响其他变量。

      另一方面,stringinttuple、... 是 immutable 数据类型。
      如果你分配a=1,那么a=212是不同的int对象,即1确实变成2,因为int是不可变的,它们可以'不被修改。

      【讨论】:

      • 技术上是正确的,但如果你解释为什么需要copy,它会大大改善这个答案。
      猜你喜欢
      • 2021-11-06
      • 1970-01-01
      • 2013-09-22
      • 1970-01-01
      • 1970-01-01
      • 2020-04-05
      • 2012-08-17
      • 2017-01-02
      • 2016-02-14
      相关资源
      最近更新 更多