不索引到布尔中时出现“布尔不可下标”错误-Python

时间:2019-03-27 02:50:38

标签: 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')的元组。 然后,我尝试使用

对其进行索引
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

另外,代码=“ +++++ [-] [-]”。

为什么在索引到元组时会引发此错误?

3 个答案:

答案 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_startedFalse,则该函数将直接返回False。

一种快速解决方案是在所有布尔返回语句之后添加一个空字符串。