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
相关产品推荐
相关产品推荐

