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,该错误会导致落子位置错乱。
修复方案
如果要在函数内模拟走子、不影响原棋盘的真实数据,必须创建完全独立的棋盘深拷贝:
- 在funcs.py文件开头导入深拷贝方法:
from copy import deepcopy - 将函数内的
temp = board替换为以下代码,生成独立的棋盘副本:temp = deepcopy(board)
深拷贝会递归复制整个二维列表结构和其中存储的所有棋子实例,后续你对temp做的走子、清空格子、修改棋子属性等操作,都只会作用在副本上,不会改动main.py中存储的真实棋盘数据。
内容的提问来源于stack exchange,提问作者kali
相关产品推荐
相关产品推荐

