我正在使用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不存在时会抛出错误。
为什么会这样?
答案 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执行短路评估,这就是您看到自己行为的原因。这同样适用于and
和or
条款。
使用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