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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 10:52:35