我具有以下功能:
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')的元组。 然后,我尝试使用
对其进行索引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
另外,代码=“ +++++ [-] [-]”。
为什么在索引到元组时会引发此错误?
答案 0 :(得分:1)
问题是,当到达'+'或'-'之类的字符时,您实际上返回的是布尔值,但是仍然访问if in_loop(i)[1] == 'loop starting':
。
您必须返回一致的返回类型,才能使第二个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
答案 1 :(得分:1)
仅当您输入的内容不是'['
或']'
时,情况才如此,因为它会到达if
的第二个if loop_started:
,默认为内部条件没有通过,只是return True
,所以这就是为什么它不起作用的原因。
答案 2 :(得分:0)
您将var loop_started
初始化为什么? (或者换句话说,当函数未执行时loop_started
的值是什么?)
如果在执行函数之前loop_started
是False
,则该函数将直接返回False。
一种快速解决方案是在所有布尔返回语句之后添加一个空字符串。