在python中遍历包含对象的队列

2024-10-06 08:43:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我是python新手,在尝试遍历队列时发现了一个奇怪的错误。在

下面是一个代码片段:

frontier = q.PriorityQueue()

    for goal in goals:
        portals = findPortals(maze)
        comb_value = heuristic(startX, startY, goal[0], goal[1])
        frontier.put_nowait((comb_value, heuristic(startX, startY, goal[0], goal[1]), 0, startX, startY, startX, startY))

        for portal in portals:
            heur = portalHeuristic(maze, startX, startY, goal[0], goal[1])
            frontier.put_nowait((heur, heur, 0, startX, startY, startX, startY))

    for elem in list(frontier):
        print(elem)

当试图打印出元素时,它显示TypeError: 'PriorityQueue' object is not iterable。我能修好这个吗?我试着在这里找到一些解决办法,但我真的没有找到任何我能理解的。。。在


Tags: inforputvaluefrontiercombmazegoal
2条回答

你可以的

for elem in frontier.queue:
        print(elem)

当然,这会破坏信息隐藏,我检查了实现代码以了解这一点,但可能属性名为self.queue而不是{},原因如下。在

PriorityQueue不支持使for循环语法适用于数据结构的内部函数(例如__iter__next)。在

相反,可以使用while循环,该循环使用empty函数检查队列是否为空,如果不为空,则根据需要调用get或{},以便在项目准备就绪时从队列中移除并返回。在

因为它需要调用者的特殊知识才能知道从队列中消费下一个项目的含义,所以不方便支持循环迭代。for循环对队列有什么作用?总是假定它在成功使用当前项后立即使用get_nowait进行消费?然后,如果队列没有立即准备好要返回的任何项,则可能会引发异常。它是否应该始终使用get并永远阻止等待每个项?那么for循环语法将掩盖可能的复杂情况,永远等待。在

标准库实现没有选择这些选项中的一个作为默认循环行为(这可能会导致许多队列用例出现意外行为),而是让调用者承担执行某些操作的负担,比如我提到的while循环,以显式描述如何“获取”队列中的每个项。在

(注意:我假设这个PriorityQueue库/实现是same as from the standard library ^{} module)。在

相关问题 更多 >