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

Python导入函数运行时意外修改外部传入棋盘变量问题排查

问题成因

Python对列表这类可变对象的传参逻辑是传递对象引用,而非传递独立副本。你在simulate_play_and_check函数中写temp = board时,并没有创建新的棋盘副本,只是给传入的原board.board变量起了个别名,temp和原变量指向内存中同一份二维列表数据,所有对temp的修改都会直接作用到原变量上。

代码中直接改动原棋盘数据的逻辑有两处:

  • 所有对temp[坐标1][坐标2]的赋值操作(比如放置选中棋子、清空棋子原位置),都是直接修改原棋盘的存储内容
  • if分支内的双层8*8遍历循环执行temp[y][x] = [],是函数运行后整个棋盘所有位置都变为空列表的直接原因

额外说明,你的main.py代码里还有一处笔误:board.board[mouse_y][mouse_y] = selected_piec这行第二个索引错误写为mouse_y,正确应为mouse_x,该错误会导致落子位置错乱。

修复方案

如果要在函数内模拟走子、不影响原棋盘的真实数据,必须创建完全独立的棋盘深拷贝:

  1. 在funcs.py文件开头导入深拷贝方法:
    from copy import deepcopy
    
  2. 将函数内的temp = board替换为以下代码,生成独立的棋盘副本:
    temp = deepcopy(board)
    

深拷贝会递归复制整个二维列表结构和其中存储的所有棋子实例,后续你对temp做的走子、清空格子、修改棋子属性等操作,都只会作用在副本上,不会改动main.py中存储的真实棋盘数据。

内容的提问来源于stack exchange,提问作者kali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 19:54:17