Python内层循环修改外层循环变量问题(井字棋场景)
问题分析与解决:列表引用导致的棋盘修改问题
为什么会出现这种行为?
在Python中,列表是可变对象。你代码里的positions只包含一个空棋盘列表,当外层循环for board in positions执行时,board变量并不是一个新列表,而是对positions中原始空棋盘的引用。这意味着内层循环里的board[occ] = "X"操作,本质是直接修改了那个唯一的原始列表——每次内层循环迭代时,上一次的修改已经被保留在原列表里,自然会出现多个X累加的情况。
如何避免该问题?
核心思路是:每次内层循环都基于原始空棋盘的副本进行修改,而不是直接操作原列表对象。Python里创建一维列表副本有几种简单方式:
- 使用列表切片:
board_copy = original_board[:] - 使用
list()构造函数:board_copy = list(original_board)
修改后的代码示例
def occurrences(s, lst): return (i for i, e in enumerate(lst) if e == s) # 保存原始空棋盘 original_board = [" ", " ", " ", " ", " ", " ", " ", " ", " "] for _ in range(original_board.count(" ")): # 每次迭代都创建全新的棋盘副本 board = original_board[:] occ = list(occurrences(" ", board))[0] board[occ] = "X" print(board[0:3]) print(board[3:6]) print(board[6:]) print("---------------------")
如果需要保留外层循环处理多初始棋盘的结构,可改成:
def occurrences(s, lst): return (i for i, e in enumerate(lst) if e == s) positions = [[" ", " ", " ", " ", " ", " ", " ", " ", " "]] for original_board in positions: for _ in range(original_board.count(" ")): board = original_board[:] occ = list(occurrences(" ", board))[0] board[occ] = "X" print(board[0:3]) print(board[3:6]) print(board[6:]) print("---------------------")
这样每次内层循环都会基于全新的空棋盘副本操作,不会影响其他迭代的结果,就能得到你预期的输出:每个棋盘里只有一个X,依次出现在不同的空位置上。
内容的提问来源于stack exchange,提问作者Knedllll
相关产品推荐
相关产品推荐

