尝试在python中创建2D数组时,"TypeError:字符串索引必须是整数"

Cri*_*ian 6 python arrays 2d

我是python(和编码)的新手,我只想根据玩家的愿望创建一个棋盘(用于控制台游戏).

基本上就是这个......

import array 
print("What size do you want the board?") 
Boardsize = input()
Tablero = array('b' [Boardsize, Boardsize])
for w in Boardsize:
    for h in Boardsize:
        Boardsize(w)(h).append('.')
print (Tablero)
Run Code Online (Sandbox Code Playgroud)

至少这是我的想法,但编译器说:

Tablero = array('b'[Boardsize, Boardsize])
TypeError: string indices must be integers
Run Code Online (Sandbox Code Playgroud)

nin*_*cko 20

这是怎么回事

input()返回一个字符串(你键入的字符,例如"123"),但是你得到的是TypeError因为你正在将字符串传递给需要数字的字符串(例如123,没有引号).


修复程序通过将字符串传递给int(...)构造函数将字符串转换为数字,例如int(input())(就像int("12")会给你一样12).

如果你不是编程的新手,我想道歉,这是一个愚蠢的错误,但如果你是新的,这是我的思考过程,帮助我调试问题.我希望你不要觉得它居高临下; 我正在分享我的思考过程,所以在类似情况下的其他人可以修复类似的错误.


如何诊断这些问题

您可以通过一次回溯一步来调试如下:

首先进行测试,以确保您了解如何array正确使用.我会尝试制作一个大小为3x3的数组,以确保我理解API.

>>> array(..., [3,3])
<array object at 0x...>
Run Code Online (Sandbox Code Playgroud)

好的,那很有效!array如果我输入数字,我们似乎能够正确地制作array(..., [3,3]).现在让我们来试试吧input().

>>> boardsize = input()
>>> array(..., [boardsize, boardsize])
TypeError: string indices must be integers
Run Code Online (Sandbox Code Playgroud)

这很奇怪.我刚刚制作了一个3x3阵列array(..., [3,3]),为什么不起作用array(..., [boardsize, boardsize])?让我们看一下boardsize真正的价值:

>>> boardsize
'3'
Run Code Online (Sandbox Code Playgroud)

有多奇怪,价值似乎是3,对吧?让我仔细检查以确保.

>>> boardsize == 3
False
Run Code Online (Sandbox Code Playgroud)

等等,'3'!= 3 ??? '3'与3不一样怎么样?

>>> type(boardsize)
<class 'str'>
Run Code Online (Sandbox Code Playgroud)

啊哈!在'我看到的意思是它是一个字符串.必须是input返回字符串的情况.这是有道理的,因为例如我可以输入"cat"和make boardsize == 'cat',我不应该期望python能够判断任意字符串是否是数字.

>>> '3'
'3'
>>> 3
3
>>> boardsize
'3'
Run Code Online (Sandbox Code Playgroud)

修复将是google for python convert string to number:second hit:"使用内置int(...)函数

tl; dr:向后走向错误,在每一步都要自我检查.当您开始制作大型程序时,您可以使用自动调用的健全性检查功能和"单元测试"来简化调试.


(旁注:如果你很好奇如何打印对象,它来自__repr__所有类定义的特殊方法.调用repr(something)将非常明确地显示什么类型的对象something; repr在您输入的交互式解释器的输出上自动调用. )

  • 嗯,我想知道为什么有人贬低了.@machine向往:1)我不同意新手程序员无法学习调试.以我的拙见,这是人们应该首先教导的.2)我进一步不同意我没有回答他的问题(我明确给出了修正).你的方式也许很好; 但我的理由是"给一个人一条鱼,你喂他一天.教一个人钓鱼,你喂他一辈子"=) (2认同)