Python布尔评估顺序

时间:2018-01-29 07:24:48

标签: python

我正在使用Python中的链接列表,并且无法弄清楚它正在推出的错误声明。

这是我通过列表头部的节点递增的代码:

    while current.next_node is not None and value > current.next_node.data:
        current = current.next_node
    current.next_node = Node(value, current.next_node)

虽然上述方法有效,但事实并非如此:

    while value > current.next_node.data and current.next_node is not None:
        current = current.next_node
    current.next_node = Node(value, current.next_node)

我认为只要while语句被评估为true或false,它就会相应地表现出来。相反,当它尝试单独运行value > current.next_node.data并意识到current.next_node不存在时会抛出错误。

为什么会这样?

2 个答案:

答案 0 :(得分:1)

论据从左到右评价,有一个“经济原则”。

  • 在“and”子句中,第一个给出False值的符号会停止评估并返回False。

  • 在“或”子句中,返回True的First会停止评估并返回True。

您可以通过首先评估“安全”状况然后评估另一个条件来使用它。

while current.next_node is not None and value > current.next_node.data:
    current = current.next_node
current.next_node = Node(value, current.next_node)

这样,第一个条件的失败将始终停止评估。如果它返回true,那么第二个将正确执行。

在另一个版本中,您可能会尝试在没有安全的情况下访问current.next_node.data。如果current为None,则会触发异常。

答案 1 :(得分:1)

Python执行短路评估,这就是您看到自己行为的原因。这同样适用于andor条款。

使用and子句,如果左侧的表达式求值为False,则整个语句无法计算为True(False且任何内容为False),因此它不会打扰评估右侧的表情。如果表达式的左侧是True,则评估右侧的表达式以查看完整表达式应该是什么。

类似地,对于or子句,如果左侧的表达式求值为True,则整个语句无法为False,因为True或任何内容始终为True。同样,右手表达式将不会被评估。但如果左侧表达式为False,则必须评估右侧表达式以了解整个表达式的值。

你可以在这里看到这个:

>>> def foo():
...     print('foo')
...     return 0

>>> def bar():
...     print('bar')
...     return 1

>>> foo() and bar()
foo
0

>>> bar() and foo()
bar
foo
0