2016-01-22 63 views
0

我正在尝试实现一个简单的TicTacToe游戏,但我无法制作某个列表的浅表副本。虽然我给你新的价值只体现在SIM卡中,变化体现在“主”板无法在Python3中创建列表的浅表副本

SIZE = 3 # size of game board 
PLAYERS = (PLAYER, COMPUTER) = "X", "O" 

class TicTacToe(list): 
    """ Class handling game board """ 
    def __init__(self, size=SIZE, players=PLAYERS): 
     """ Board size defaults to 3 """ 
     super().__init__([[" " for idx in range(size)] for jdx in range(size)]) 
     self._size = size 

    def winner_move(self, letter, range_): 
     """ Determine winner move - range_ members are tuples """ 
     for tile in range_: 
      sim = self[:] # shallow copy of game board for simulation 
      sim[tile[0]][tile[1]] = letter 
      print("Current board:") 
      print(self) 
      # code makes some decisions here and continues 

    def get_empty(self): 
     """ Return empty places on board as a set of (row, col) """ 
     return {(row, col) for row in range(self._size)\ 
       for col in range(self._size) if self[row][col] == " "} 

board = TicTacToe() 
board.winner_move(PLAYER, board.get_empty()) 

: 下面是我的脚本最小提取物,呈现我的问题。我也试过

sim = list(self) 

sim = [item for item in self] 

但都给予同样的结果。

任何建议我做错了什么?

+2

TicTacToe是一个2D结构,你真的需要浅而不深的复制? – Arpegius

+0

@Arpegius是赖特,你需要深刻的复制 –

回答

1

Arpegius' comment是对的。你有一个嵌套列表。使用sim = self[:],sim = list(self)sim = [item for item in self],您会得到一个新的外部列表,但它将成为与内部列表相同的列表。

sim = [lst[:] for lst in self] 

sim = [list(lst) for lst in self] 

会工作,但

from copy import deepcopy 
# ... 
sim = deepcopy(self) 

更优雅,其目的是更容易理解。见its documentation

+0

谢谢你们,我从你身上学到了很多东西:-) – rolika