【问题标题】:Python return statement doesn't break for loopPython return 语句不会中断 for 循环
【发布时间】:2020-09-15 13:41:23
【问题描述】:

我想遍历一个 XML 结构。我的代码似乎确实有效。我检查了调试器,发现它到达了return,但for 循环仍在继续。

期待您的建议,谢谢!

def get_value(root, item):
    for node in root:
        if node.tag == item:
            return node.tag
        else:
            get_value(node, item)
    return 'Item not found in XML'

【问题讨论】:

  • 循环在任何情况下都不会在到达return 后继续。您一定已经看到之前的递归调用完成了。
  • 这是不可能的,如果遇到return 语句,您的for 循环的进一步迭代将不会执行。请注意,您的函数是递归的,因此在单步调试器时请注意这一点。
  • 如果您希望整个递归调用链在return 上退出,请参阅我对this 问题的回答。
  • 我们需要minimal reproducible example 来提供帮助。这段代码甚至没有正确缩进。而且还不清楚您期望else: 条件会做什么(您进行递归调用并忽略返回值)。如果您实际到达return,该函数总是立即返回,除非:1) 与return 关联的表达式触发异常(例如node 没有tag 属性)或2) 存在withtry/finally 参与,在这种情况下with/finally 清理首先发生。为什么你认为循环在return 之后继续?
  • 看起来您可能正在返回对函数的先前调用,因为您似乎正在使用递归。如果函数中的 any 代码从其中返回,则不会在任何情况下继续运行。

标签: python python-3.x


【解决方案1】:

这里的问题是,你调用的是相同的函数是 else 语句。因此,如果它进入 else 块,它可能会递归地继续。 尝试修改代码,避免从内部调用函数。此外,您可能需要将 return 放在 for 循环中,如下所示

def get_value(root, item):
    for node in root:
        if node.tag == item:
            return node.tag
        else:
            get_value(node, item) ---> This is the problem
        return 'Item not found in XML'

【讨论】:

    【解决方案2】:

    当您开始递归调用时,您忘记了 return 语句。这意味着它将永远持续下去,直到达到最大递归限制或内存不足。

    像这样改变你的代码

    def get_value(root, item):
        for node in root:
            if node.tag == item:
                return node.tag
            else:
                return get_value(node, item)
        return 'Item not found in XML'
    

    【讨论】:

      最近更新 更多