Python初始化二维数组仍报'object is not subscriptable'错误及替换方法咨询
问题分析与解决方案
1. 'object is not subscriptable' 错误原因
你的代码中这一行是直接语法错误:
playerOneBoard.insert[x, "D"]
insert是Python列表的方法,调用方法必须用圆括号()传参,方括号[]仅用于下标访问(比如取列表元素)。这里把方法当成了可下标访问的对象,所以抛出该错误。
另外,你的需求是修改二维数组指定位置的元素,而非插入新元素(insert会增加数组长度,破坏原有结构),所以根本不应该使用insert,正确做法是通过二维下标直接赋值。
2. 二维数组初始化的隐藏坑
你当前的初始化方式:
playerOneBoard = [[0]*row]*col
这是常见误区:[[0]*row]创建了一个含row个0的列表,*col只是把这个列表的引用复制了col次——也就是说,数组的每一行其实是同一个列表的引用,修改任意一行的元素,所有行都会同步变化。
正确的初始化方式要用列表推导式,确保每行都是独立列表:
playerOneBoard = [[0 for _ in range(row)] for _ in range(col)] playerTwoBoard = [[0 for _ in range(row)] for _ in range(col)] playerOneFound = [["_" for _ in range(row)] for _ in range(col)] playerTwoFound = [["_" for _ in range(row)] for _ in range(col)]
3. 修改指定位置元素的正确代码
结合坐标转换(用户输入的x、y减1转为数组下标),将错误的insert行替换为二维下标赋值:
# 注意:用户输入的x是列坐标,y是行坐标,对应二维数组的 [行][列] playerOneBoard[y][x] = "D"
修正后的placeDestroyer函数示例:
def placeDestroyer(Player): if Player == 1: for a in playerOneBoard: print(a) print("\nWhat is the x cooridnate of the destroyer?") x = int(input(" ")) print("\nWhat is the y coordnate of the destroyer? (Please use integer values)") y = int(input(" ")) x -= 1 y -= 1 # 直接赋值修改指定位置 playerOneBoard[y][x] = "D" for a in playerOneBoard: print(a)
4. 替换二维数组中的特定字符
如果需要批量替换特定字符,有两种常用方式:
方法1:列表推导式(简洁高效)
# 替换playerOneBoard中所有的0为"-" playerOneBoard = [["-" if elem == 0 else elem for elem in row] for row in playerOneBoard]
方法2:遍历修改(直观易读)
target_char = 0 replace_char = "-" for i in range(len(playerOneBoard)): for j in range(len(playerOneBoard[i])): if playerOneBoard[i][j] == target_char: playerOneBoard[i][j] = replace_char
内容的提问来源于stack exchange,提问作者user14579040
相关产品推荐
相关产品推荐

