Python嵌套列表浅拷贝修改临时变量时原列表被同步改动如何解决?
问题原因
你所使用的get_pieces.copy()、list(get_pieces)、get_pieces[:]都属于浅拷贝操作,而temp = get_pieces甚至只是直接的引用赋值,没有做任何拷贝。
对于井字棋棋盘这种二维嵌套列表结构,浅拷贝只会复制外层列表的容器,内层存储每一行的子列表仍然和原列表的子列表指向同一块内存空间。当你修改temp[i][j]时,本质是修改了两个列表共享的子列表元素,所以原列表get_pieces会同步发生改动。
解决方法
你需要对二维列表做深拷贝,保证内外层列表都是独立的内存空间,有两种常用实现方案:
- 方案1:手动逐行拷贝子列表,适合固定维度的二维列表,性能开销更小
将你原来的拷贝逻辑替换为逐行复制:
temp = [row.copy() for row in get_pieces]
- 方案2:使用Python标准库
copy模块的deepcopy方法,适合任意层级的嵌套结构
首先在文件头部导入依赖:
import copy
再替换拷贝逻辑:
temp = copy.deepcopy(get_pieces)
修正后你的落子逻辑不会再改动原棋盘数据,你也可以删掉没有实际作用的temp = []行。
内容的提问来源于stack exchange,提问作者Jerome Palayoor
相关产品推荐
相关产品推荐

