You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python 3类内列表未更新问题:self.cell始终返回初始值

解决你的Tic-Tac-Toe棋盘更新问题

哦,这个问题我太熟悉了——你犯了一个很常见的新手错误:每次操作都在创建新的棋盘实例,而不是复用同一个!

问题根源分析

看你的代码逻辑:

  • 当调用ref_scr()时,里面执行board().display()——这会生成一个全新的board对象,它的cell始终是初始的['-','-','-','-','-','-','-','-','-']
  • 当你调用board().update_cell(cell_in,player)时,又创建了另一个完全独立的board对象,修改它的cell后,这个对象直接被系统回收了,和你显示的那个棋盘没有任何关联

简单说:你同时拥有好几个不同的棋盘,修改了其中一个,却在看另一个全新的,当然看不到更新效果!

修复方案:复用同一个棋盘实例

你只需要在程序启动时创建一个棋盘对象,然后在整个循环中都使用这个对象,而不是每次都新建。具体修改步骤如下:

  1. 调整ref_scr()函数,让它接收一个棋盘实例作为参数,不再自己新建
  2. 在主循环开始前,创建唯一的棋盘实例
  3. 所有显示、更新操作都基于这个实例来调用方法

修改后的完整代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:49:29