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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 09:50:42