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

Python—对方法和while循环非常困惑,python,while-loop,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(): retu

我有这个方法:

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
我将这个方法放在一起,并将
引发异常(child.display\u name)
放在一起测试并“alert()”告诉我哪个孩子被击中了。这一例外从未提出过。您可能认为这是因为函数在
if child.is\u current\u node()部分上返回了
True
。好吧,如果我用这个替换
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岁,我不能用头脑来思考这个问题。

也许是“当前”节点总是返回True,而“当前”选项卡总是返回False?我认为需要更多的背景来给你一个答案

我唯一能想到的是,当前节点会改变状态。

一些想法:

cur_children=self.\u children 虽然cur_children不是无: 对于cur_儿童中的儿童: 如果子节点是当前节点(): 返回真值 引发异常(子项显示\u名称) cur_children=cur_children.\u children

我假设
self.\u children
包含多个子元素:
[A,B,C]

然后,在第一个循环中,需要
A
。让我们假设
A
有以下子项:
[AA,AB,AC
]

现在,您可以这样做:
cur\u children=cur\u children.\u children
。这意味着,现在不再从初始
[A,B,C]
继续执行
B
,而是继续执行
AA
,依此类推

在本例中,它永远不会到达
B
。这是有意的吗


您的
当前节点()包含什么内容?可能您忘记了返回值,因此结果总是
None
,并且
bool(None)==False


另一个想法:(递归)


如果list.中的第一个子项是\u current\u node(),则在第一个代码段中永远不会引发异常

所有证据都支持self.is\u current\u node()始终为真,或者第一个扫描的子项.is\u current\u node()始终为真。给出第三个代码段,后者似乎就是这样

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


事实上,我不得不问,这能做什么?它看起来有点像递归树遍历,但不太像。(cur_children=cur_children.get_children()行尤其有点奇怪)

是当前的\u节点
方法中有什么?它只是根据
self检查一个静态值。\u url
并以布尔值的形式返回比较结果。@Eric-异常不应该总是在前两个版本中的一个中出现吗?第二个命令说,
如果为True:raise
并且不从函数返回。第一个选项是
raise
,如果
中没有一个选项为True:
从函数返回。@aaronastering-如果是这样,为什么第一个版本不总是引发异常?第一个基本上是这样的,“For each:if True:return;raise;”oops,请参见我的编辑。我在编辑时更改了名称。抱歉,它们都是相同的函数。谢谢,但是在您的示例中,
children
在哪里定义或传递到函数中?您的意思是:
返回检查\u children(self.children)
,还是我遗漏了什么?由于某种原因,树遍历对我来说太混乱了。
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)