Python 3类内列表未更新问题:self.cell始终返回初始值
解决你的Tic-Tac-Toe棋盘更新问题
哦,这个问题我太熟悉了——你犯了一个很常见的新手错误:每次操作都在创建新的棋盘实例,而不是复用同一个!
问题根源分析
看你的代码逻辑:
- 当调用
ref_scr()时,里面执行board().display()——这会生成一个全新的board对象,它的cell始终是初始的['-','-','-','-','-','-','-','-','-'] - 当你调用
board().update_cell(cell_in,player)时,又创建了另一个完全独立的board对象,修改它的cell后,这个对象直接被系统回收了,和你显示的那个棋盘没有任何关联
简单说:你同时拥有好几个不同的棋盘,修改了其中一个,却在看另一个全新的,当然看不到更新效果!
修复方案:复用同一个棋盘实例
你只需要在程序启动时创建一个棋盘对象,然后在整个循环中都使用这个对象,而不是每次都新建。具体修改步骤如下:
- 调整
ref_scr()函数,让它接收一个棋盘实例作为参数,不再自己新建 - 在主循环开始前,创建唯一的棋盘实例
- 所有显示、更新操作都基于这个实例来调用方法
修改后的完整代码
class board(): def __init__(self): self.cell=['-','-','-','-','-','-','-','-','-'] def display(self): x=0 c= self.cell for i in range(0,3): for j in range(0,3): if(j == 0): # 这里建议用==代替is,避免身份判断的潜在坑 print(' ',end='') print(c[x],end='') x+=1 if(j<2): print(' | ',end='') if(i<2): print('\n-----------') print() def update_cell(self,cell_in,player): self.cell[(cell_in-1)]= player def header(): print("-TicTacToe-") # 修改:接收board实例作为参数,复用同一个对象 def ref_scr(game_board): cls() header() game_board.display() # 主程序:创建唯一的棋盘实例,全程复用 game_board = board() while True: ref_scr(game_board) # 传入同一个实例显示 cell_in = int(input("enter cell between 1 and 9: ")) player= 'X' game_board.update_cell(cell_in,player) # 用同一个实例更新
额外小建议
- 代码里的
if(j is 0)建议改成if(j == 0)——is是用来判断对象身份的,对于整数0虽然大部分场景没问题,但用==判断值相等才是更严谨的写法 - 可以添加输入校验逻辑,比如判断
cell_in是否在1-9之间,以及目标格子是否未被占用,避免非法输入导致的程序异常
内容的提问来源于stack exchange,提问作者Sharoz Tanveer
相关产品推荐
相关产品推荐

