#python #boolean
#python #boolean
Вопрос:
У меня есть следующая функция:
def in_loop(i):
global loop_started
if i == '[':
loop_started = True
return [True, 'loop starting']
if loop_started:
if i == ']':
loop_started = False
return [True, 'loop over']
return True
return False
Я полагаю, что это возвращает кортеж, который выглядит как (True, ‘loop over’), когда i равен «]».
Затем я пытаюсь проиндексировать его с помощью
for index, i in enumerate(code):
if in_loop(i):
loop_counter = 1
if in_loop(i)[1] == 'loop starting':
loop_start = index
if in_loop(i)[1] == 'loop over':
loops[f'loop{loop_num}'] = {'start': loop_start, 'end': index}
loop_num = 1
но это вызывает ошибку
TypeError: 'bool' object is not subscriptable
Кроме того, код = » [-][-]».
Почему возникает эта ошибка при индексации в кортеж?
Комментарии:
1. Что происходит, когда
i
этого]
тоже нет. (None
возвращается)2. @Kingsley Я думаю, что в этом проблема, на самом деле, я также считаю, что отсутствует фрагмент кода, который возвращает
boolean
3. Это работает для меня:
if in_loop(']')[1] == 'loop_over':
однако, если я не передаю']'
какi
, я получаюNoneType object is not subscriptable
4. Когда i нет ], он выполняет другие действия, я просто не включил это, чтобы упростить чтение
5. Проблема в том, что
return False
/return True
когдаi
не является ни'['
, ни']'
Ответ №1:
Проблема в том, что при достижении символов типа ‘ ‘ или ‘-‘ вы, по сути, возвращаете логическое значение, но, тем не менее, получаете доступ if in_loop(i)[1] == 'loop starting':
.
Вы должны вернуть согласованный возвращаемый тип, чтобы код 2-го цикла for работал. Например, посмотрите на комментарии ниже к вашему коду:
def in_loop(i):
global loop_started
if i == '[':
loop_started = True
return [True, 'loop starting']
if loop_started:
if i == ']':
loop_started = False
return [True, 'loop over']
return True #This will have side effects and is inconsistent with your other returns of in_loop
return False #This will have side effects and is inconsistent with your other returns of in_loop
Ответ №2:
Это имеет место только тогда, когда вы вводите что-то, что не является '['
or ']'
, потому что это дошло бы до второго if
из if loop_started:
, и по умолчанию, если внутреннее условие не выполняется, это было бы просто return True
, вот почему это не работает.
Ответ №3:
Как вы инициализировали var loop_started
? (Или, другими словами, какое значение loop_started
имеет, когда функция не была выполнена?)
Если loop_started
это False
перед выполнением функции, то функция будет возвращать False напрямую.
Быстрым исправлением было бы добавление пустой строки после всех логических операторов return.