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

Python列表实现井字棋报错:TypeError,字符串不支持元素赋值

问题描述

尝试用Python列表实现井字棋程序,代码如下:

theBoard=[' '' '' ']*3
def userInput(board):
    loop=True
    while loop:
        userInput=input("Please enter (row,column)")
        row=int(userInput[0])
        column=int(userInput[2])
        if row<1 or row>3:
            print('[ERROR: Invalid Input]')
            loop=True
        elif column<1 or column>3:
            print('[ERROR: Invalid Input]')
            loop=True
        else:
            board[row-1][column-1]='X'
            loop=False

def drawBoard(board):
    #Function that prints out board
    print(board[0][0]+' | '+board[0][1]+' | '+board[0][2])
    print('---------')
    print(board[1][0]+' | '+board[1][1]+' | '+board[1][2])
    print('---------')
    print(board[2][0]+' | '+board[2][1]+' | '+board[2][2])
    print('---------')

userInput(theBoard)
drawBoard(theBoard)

运行时报错:TypeError: 'str' object does not support item assignment。即使把theBoard=[' '' '' ']*3改成theBoard=[' ',' ',' ']*3,错误依然存在。

问题原因

核心问题是列表结构错误:

  • 你初始化的theBoard是一维列表,里面的元素都是单个空格字符串(或三空格字符串)。比如[' ',' ',' ']*3会生成包含9个空格字符串的一维列表,[' ', ' ', ' ']则是包含3个三空格字符串的一维列表。
  • 代码里board[row-1][column-1]='X'是按二维列表的逻辑访问,此时board[row-1]取到的是一个字符串,而字符串是Python的不可变类型,无法通过索引赋值,因此触发报错。

修复方案

1. 正确初始化二维列表

需要创建一个包含3个子列表的二维列表,每个子列表代表一行,且每个子列表都是独立的(避免用[[' ', ' ', ' ']]*3,否则修改一行会影响所有行):

theBoard = [[' ', ' ', ' '] for _ in range(3)]

2. 优化输入处理(可选但必要)

原输入逻辑依赖固定位置的字符,一旦用户输入格式稍有变化(比如不带括号、带空格)就会报错,可优化为通过分割解析输入:

完整修复代码

theBoard = [[' ', ' ', ' '] for _ in range(3)]

def userInput(board):
    loop=True
    while loop:
        try:
            user_input = input("Please enter (row,column): ").strip()
            # 去除括号并分割行列
            row_str, col_str = user_input.strip('()').split(',')
            row = int(row_str.strip())
            column = int(col_str.strip())
            if 1 <= row <=3 and 1 <= column <=3:
                board[row-1][column-1]='X'
                loop=False
            else:
                print('[ERROR: Invalid Input]')
        except (ValueError, IndexError):
            print('[ERROR: Invalid Input]')

def drawBoard(board):
    print(board[0][0]+' | '+board[0][1]+' | '+board[0][2])
    print('---------')
    print(board[1][0]+' | '+board[1][1]+' | '+board[1][2])
    print('---------')
    print(board[2][0]+' | '+board[2][1]+' | '+board[2][2])
    print('---------')

userInput(theBoard)
drawBoard(theBoard)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 07:01:12