Python:没有使用“SyntaxError:'break'out outside loop”中断while循环

时间:2018-01-03 12:59:17

标签: python while-loop break

我正在为分解问题开发广度优先搜索算法,并且在尝试突破while循环时遇到了一个有趣/混乱的错误。如果您运行下面的代码,它将在“construct_path”方法中失败,说明:

文件“main.py”,第96行     打破 SyntaxError:'break'在循环外部

但我在一个循环中!如果有人能就这个问题给我一些建议,我会非常感激。提前谢谢。

from numpy import random
import itertools
import Queue




#Finding multiples, BFS problem
#Given input of list with unique integers 0 - 9 and n = range(0,1000000), calculate smallest multiple of n and unique combination of values in the list

#Example : Input : list = {0,1,2} , n = 3, 
#           output = 12
#          Input : list = {0,1,2} , n = 50
#          Output = 200

class Problem:



    def __init__(self):
        self.n = random.randint(0,10000000)
        listSize = random.randint(1,9)
        mainSet = set()
        self.mainList = []

        while True:
            toAdd = random.randint(0,9)

            if(toAdd not in self.mainList):
                self.mainList.append(toAdd)

            if(len(self.mainList) == listSize):
                break




    def get_start_state(self):
        s = ''.join(map(str, self.mainList))

        return int(s)

    def is_goal(self, state):
        return True

    def get_sucessors(self):
        print "Getting successors"



def breadth_first_search(problem):

    # a FIFO open_set
    open_set = Queue.Queue()
    # an empty set to maintain visited nodes
    closed_set = set()

    # a dictionary to maintain meta information (used for path formation)
    meta = dict()  # key -> (parent state, action to reach child)

    # initialize
    start = problem.get_start_state()
    meta[start] = (None, None)
    open_set.put(start)

    while not open_set.empty():

        parent_state = open_set.get()
        print "{} {}".format("parent_state is ", parent_state)


        if problem.is_goal(parent_state):
            return construct_path(parent_state, meta)

        for (child_state, action) in problem.get_successors(parent_state):
            if child_state in closed_set:
                continue

            if child_state not in open_set:
                meta[child_state] = (parent_state, action)
                open_set.put(child_state)
        closed_set.add(parent_state)

#collect path to desired answer
def construct_path(state, meta):
    action_list = list()

    while True:
        row = meta[state]
        if (len(row) == 2):
            state = row[0]
            action = row[1]
            action_list.append(action)

        else:
            break


    return action_list.reverse()


x = Problem() 

breadth_first_search(x)

1 个答案:

答案 0 :(得分:0)

可能是您有多个标签和空格,以便第96行中的break看起来像是缩进到action_list.append(action)以下,但实际上它低于while。这至少可以解释这个错误。

这只是猜测。但它可能是这样的,在编辑器中使用4的可见tabwidth:

→   while True:
→   →   row = meta[state]
        if (len(row) == 2):
            state = row[0]
            action = row[1]
            action_list.append(action)

        else:
            break

对于Python解释器,这看起来像这样(因为它假设tabwidth为8):

→       while True:
→       →       row = meta[state]
        if (len(row) == 2):
            state = row[0]
            action = row[1]
            action_list.append(action)

        else:
            break

这仍然有效,但显然意味着一个不同的东西,并将你的休息放在while循环之外。