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

&引用;TypeError:字符串索引必须是整数;尝试在python中创建2D数组时,python,arrays,2d,Python,Arrays,2d,我对python(和编码)是如此陌生,我只想根据玩家的需求创建一个棋盘(用于控制台游戏) 基本上是这个 导入数组 打印(“您想要多大尺寸的板?”) Boardsize=输入() Tablero=数组('b'[Boardsize,Boardsize]) 对于尺寸为w的板: 对于尺寸为h的板: Boardsize(w)(h).附加('.')) 打印(Tablero) 至少这是我的想法,但编译器说: Tablero = array('b'[Boardsize, Boardsize]) TypeErr

我对python(和编码)是如此陌生,我只想根据玩家的需求创建一个棋盘(用于控制台游戏)

基本上是这个

导入数组
打印(“您想要多大尺寸的板?”)
Boardsize=输入()
Tablero=数组('b'[Boardsize,Boardsize])
对于尺寸为w的板:
对于尺寸为h的板:
Boardsize(w)(h).附加('.'))
打印(Tablero)
至少这是我的想法,但编译器说:

Tablero = array('b'[Boardsize, Boardsize])
TypeError: string indices must be integers

发生了什么事

input()
返回一个字符串(您键入的字符,例如“123”),但您将得到一个
TypeError
,因为您将字符串传递给需要数字的对象(例如123,不带引号)


解决方案

修复方法是通过
int(…)
构造函数将字符串转换为数字,例如
int(input())
(就像
int(“12”)
将为您提供
12

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


如何诊断此类问题

您可以通过一次回溯一个步骤进行如下调试:

� 首先进行测试,以确保您了解如何正确设置
array
s。例如,我会尝试制作一个大小为3x3的数组,以确保我理解API

� 这很奇怪。我刚刚用
数组(…,[3,3])制作了一个3x3数组
,为什么
数组(…,[boardsize,boardsize])
不起作用?让我们检查一下
boardsize
的实际值:

� 真奇怪,这个值似乎是
3
,对吗?让我再确认一下

� 等等,“3”=3.“3”和“3”怎么不一样

� 修复方法是在谷歌上搜索
python将字符串转换为数字:第二步:“使用内置的
int(…)
函数

tl;dr:朝错误的方向后退,每一步都要检查自己的健全性。当你开始制作大型程序时,你可以使用自动调用的健全性检查函数和“单元测试”来简化调试。



(旁注:如果您想知道对象是如何打印出来的,那么它来自所有类定义的特殊的
\uuuu repr\uuuu
方法。调用
repr(某物)
将非常明确地显示对象的类型
某物
是什么;
repr
将在您输入交互式解释器的输出中自动调用。)

让我提供一个我认为有助于您调试的答案。您说您遇到了错误:

Tablero = array('b'[Boardsize, Boardsize])
TypeError: string indices must be integers
考虑错误的内容。索引运算符是紧跟在变量后面的方括号,
myvar[n]
,在这些方括号之间插入的任何内容都将被视为该变量的索引
myvar
(即,
列表
元组
字符串
)具有整数索引。您的
类型错误
后的消息表示您的代码试图使用整数以外的内容对字符串进行索引。以下是一个示例,您可以在交互式解释器中尝试:

>>> mystr = 'cool beans, bro!' # define a string (sequence type)
>>> mystr                    # echo the value of the string by entering its name
'cool beans, bro!'

>>> mystr[0] # sequence indices start at 0, so this gives us the first character
'c' 

>>> mystr[6] # similarly, the seventh character (index 6)
'e'

>>> mystr['cool story, sis!'] # a string is not a valid index of a string
TypeError: string indices must be integers
但是,您会说,您在代码中的什么地方尝试对字符串进行索引?好吧,在任何变量之后立即放上方括号会使python假定您正在尝试访问它的某个索引处的值。您的代码说
'b'[Boardsize,Boardsize]
。如果您想同时传递
'b'
[Boardsize,Boardsize]
作为
数组
构造函数的参数,需要在这些值之间加一个逗号,如:

Tablero = array('b', [Boardsize, Boardsize])
不过,我还是要提醒大家不要使用
数组
类型,除非你认为你有很好的理由这样做。很难理解其中的逻辑,尤其是来自其他一些编程范例,但在python中,如果你能摆脱它,坚持使用泛型
列表
数据结构要简单得多。a
列表
非常类似于数组
,但在后者中,您必须提前告诉它您将提供的数据大小,这通常是不必要的特定数据,除非尝试在内存管理方面进行高度优化。要定义列表,它非常简单:

tablero = [ ]
注意这里有两件事。首先,作为python中的惯例,大多数变量名应该是
小写的
小写的_加下划线
。其次,在这种上下文中,不紧跟在变量后面的方括号表示与索引运算符完全不同的内容:它们表示
列表
构造函数,这意味着括号内任何逗号分隔的值都将成为新列表的值

[Boardsize, Boardsize]
将为您提供一个包含两个值(分别为Boardsize和Boardsize)的列表。我将让您自行决定如何使用
列表
类型以满足您的需要,请尝试,并注意您可以制作嵌套列表

感谢ninjagecko帮助我想出了一个有用的答案。

示例代码

Tablero = array('b'[Boardsize, Boardsize])
TypeError: string indices must be integers
不允许使用整数索引。要使其正常工作,可以按以下指定声明DICT:

Tablero = {}
Tablero = array('b'[Boardsize, Boardsize])
TypeError: string indices must be integers

希望这对你有用。

1:你应该使用列表。2:你应该用逗号分隔参数
,但并没有真正回答他的问题。我怀疑他是否理解该死的str.\uu repr\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu不知道为什么有人投了反对票。@machinearning:1)我不同意新手程序员不能学会调试。在我的亨伯
>>> mystr = 'cool beans, bro!' # define a string (sequence type)
>>> mystr                    # echo the value of the string by entering its name
'cool beans, bro!'

>>> mystr[0] # sequence indices start at 0, so this gives us the first character
'c' 

>>> mystr[6] # similarly, the seventh character (index 6)
'e'

>>> mystr['cool story, sis!'] # a string is not a valid index of a string
TypeError: string indices must be integers
Tablero = array('b', [Boardsize, Boardsize])
tablero = [ ]
[Boardsize, Boardsize]
Tablero = array('b'[Boardsize, Boardsize])
TypeError: string indices must be integers
Tablero = {}
Tablero = array('b'[Boardsize, Boardsize])
TypeError: string indices must be integers