Что происходит
input()
возвращает строку (символы, которые вы ввели, например, «123»), но вы получаете TypeError
, потому что вы передаете строку чему-то, что ожидает число (например, 123, без кавычек) .
Решение
Исправление заключается в преобразовании строки в число путем ее передачи через конструктор int(...)
, например, int(input())
(точно так же, как int("12")
даст вам 12
).
Я бы хотел извиниться, если вы не новичок в программировании, и это была глупая ошибка, но если вы новичок, вот мой мыслительный процесс, который помог мне отладить проблему. Я надеюсь, что вы не находите это снисходительным; Я делюсь своим мыслительным процессом, чтобы другие люди в похожих ситуациях могли исправлять подобные ошибки.
Как диагностировать подобные проблемы
Вы бы отладили это следующим образом, возвращаясь на шаг назад за один раз:
Первый тест, чтобы убедиться, что вы понимаете, как правильно сделать array
s. Я, например, попытался бы создать массив размером 3х3, чтобы убедиться, что я понял API.
>>> array(..., [3,3])
<array object at 0x...>
Хорошо, это сработало! Кажется, мы можем правильно набрать array
, если я просто наберу цифры array(..., [3,3])
. Теперь давайте попробуем с input()
.
>>> boardsize = input()
>>> array(..., [boardsize, boardsize])
TypeError: string indices must be integers
Это странно. Я только что сделал массив 3х3 с array(..., [3,3])
, почему 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'
Исправление будет в Google для python convert string to number
: второй удар: "использовать встроенную функцию int(...)
tl; dr: двигайтесь назад к ошибке, проверяя здравомыслие на каждом шагу. Когда вы начинаете создавать большие программы, вы можете использовать автоматически называемые функции проверки работоспособности и «модульные тесты», чтобы упростить отладку.
(sidenote: если вам интересно, как распечатываются объекты, это происходит из специального метода __repr__
, который определяют все классы. Вызов repr(something)
покажет довольно однозначно, что за объект something
; repr
автоматически вызывается при выводе того, что вы вводите в интерактивный интерпретатор.)