Python - 对方法和while循环非常困惑

时间:2010-08-27 19:05:49

标签: python while-loop

我有这个方法:

def is_active(self):
    if self.is_current_node():
        return True
    cur_children = self.get_children()
    while cur_children is not None:
        for child in cur_children:
            if child.is_current_node():
                return True
            raise Exception(child.display_name)
        cur_children = cur_children.get_children()
    return False

我把这个方法放在一起,然后我把raise Exception(child.display_name)测试出去,然后“警告()”告诉我哪个孩子被击中了。永远不会引发异常。您认为这是因为函数在True部分返回if child.is_current_node()。好吧,如果我用这个替换if部分:

        for child in cur_children:
            if child.is_current_node():
                raise Exception(child.display_name)

它仍然没有引发异常。如果我这样做:

        for child in cur_children:
            raise Exception(child.display_name)

引发异常。我很困惑。我确信这是荒谬的,但我一直到2岁,我不能直接思考我的小脑袋。

3 个答案:

答案 0 :(得分:2)

如果列表.is_current_node()中的第一个子节点,则永远不会在您的第一个片段中引发异常。

您拥有的所有证据都支持self.is_current_node()始终为true或第一个扫描子.is_current_node()的想法。鉴于第三个代码片段,后者似乎就是这种情况。

编辑:消除误解(孩子!=自我):/

实际上,我不得不问,这应该做什么?它看起来有点像递归树遍历,但它并不完全存在。 (cur_children = cur_children.get_children()行特别有点奇怪)

答案 1 :(得分:1)

一些想法:

cur_children = self._children     而cur_children不是None:         对于孩子在cur_children:             if child.is_current_node():                 返回True             引发异常(child.display_name)         cur_children = cur_children._children

我认为self._children包含多个孩子:[A, B, C]

然后,在第一个循环中,它将需要A。我们假设A有这些孩子:[AA, AB, AC]。

现在,您执行此操作:cur_children = cur_children._children。这意味着现在,不是继续使用B中的[A, B, C],而是继续使用AA,依此类推。

在此示例中,它永远不会到达B。这是为了吗?


您的is_current_node()包含哪些内容?可能您忘记返回值,因此结果始终为Nonebool(None) == False


另一个想法:(递归)

def is_active(self):

    def check_children(children):
        for child in children:
            if child.is_current_node():
                return True
            else:
                if children._children:
                    return check_children(children._children)
        return False

    if self.is_current_node():
        return True
    return check_children(children)

答案 2 :(得分:0)

也许is_current_node总是返回True而is_current_tab总是返回False?我认为需要更多的背景来给你一个答案。

我唯一能想到的是is_current_node改变状态。