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

时间:2011-07-16 00:48:36

标签: 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)

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

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

3 个答案:

答案 0 :(得分:20)

发生了什么

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


<强>解决方案

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

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


如何诊断这类问题

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

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

>>> array(..., [3,3])
<array object at 0x...>

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

>>> boardsize = input()
>>> array(..., [boardsize, boardsize])
TypeError: string indices must be integers

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

>>> boardsize
'3'

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

>>> boardsize == 3
False

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

>>> type(boardsize)
<class 'str'>

啊哈! '我看到它意味着它是一个字符串。必须是input返回字符串的情况。这是有道理的,因为例如我可以键入“cat”并生成boardsize == 'cat',我不应该期望python能够判断任意字符串是否为数字。

>>> '3'
'3'
>>> 3
3
>>> boardsize
'3'

修复将是谷歌python convert string to number:第二次点击:“使用内置int(...)功能

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


(旁注:如果您对如何打印对象感到好奇,它来自所有类定义的特殊__repr__方法。调用repr(something)将明确无误地显示哪种对象{{1} }; something会自动在您输入交互式解释器的输出中调用。)

答案 1 :(得分:2)

让我提供一个我认为可以帮助您调试的答案。你说你得到了错误:

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

考虑错误的内容。索引运算符紧跟在变量myvar[n]之后的方括号,并且在这些方括号之间放置的任何n将被视为该变量myvar的索引。您通常使用整数索引索引所谓的“序列类型”(即listtuplestring)。 TypeError后面的消息表明您的代码尝试使用整数以外的字符串索引字符串。以下是您可以在交互式解释器中尝试自己的示例:

>>> 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]作为参数传递给array构造函数,则需要在这些值之间加上逗号,例如:

Tablero = array('b', [Boardsize, Boardsize])

但是我要小心不要使用array类型,除非你认为你有充分的理由。很难看到这个逻辑,特别是来自其他一些编程范例,但在python中,当你可以侥幸逃脱它时,坚持使用通用list数据结构要简单得多。 list很像array,但在后者中你需要告诉它你提前给出的大小数据,这通常是不必要的,除非在尝试高度优化时尊重内存管理。要定义列表,它就像:

一样简单
tablero = [ ]

请注意这里的两件事。首先,作为python中的约定,大多数变量名称应为lowercaselower_with_underscores。其次,方括号不是紧接在变量之后的上下文中意味着与索引操作符完全不同:它们表示list构造函数,意味着括号内的任何逗号分隔值变为新列表的值。所以表达式

[Boardsize, Boardsize]

会给你一个包含两个值的列表(分别是Boardsize和Boardsize)。我会留给您了解如何使用list类型来满足您的需求,尝试brief tutorial in the official documentation,并注意您可以制作嵌套列表。

感谢ninjagecko帮助我集体讨论一个有用的答案。

答案 2 :(得分:0)

示例代码

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

不允许使用整数索引。为了使其正常工作,您可以按照以下规定声明DICT:

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

希望这适合你。