Python如何停止短路?

How to stop short circuiting in Python?

Python 短路逻辑运算符。 例如:

if False and Condition2:
    #condition2 won't even be checked because the first condition is already false.

有没有办法阻止这种行为。我希望它检查这两个条件,然后执行和操作(如在 c、c++ 等中所做的那样)。当我们根据条件执行某些操作时,它很有用。例如:

if a < p.pop() and b < p.pop():

一种方法是检查之前的条件,然后比较布尔值。但那样会浪费内存。

您可以使用 all() and any() 内置函数以某种方式模拟 andor 运算符。两者都将可迭代的布尔值作为参数。如果你给它一个文字元组或列表,所有成员将被完全评估:

# all emulates the and operator
if all((False, Condition2)):
    do_stuff()


# any emulates the or operator
if any((False, Condition2)):
    do_stuff()
if all([a < p.pop(), b < p.pop()])

这将创建一个列表,将对其进行整体评估,然后使用 all 确认两个值都是真实的。但这有点晦涩难懂,我宁愿建议您编写简单易懂的代码:

a_within_limit = a < p.pop()
b_within_limit = b < p.pop()
if a_within_limit and b_within_limit:

简短回答:不,你不能阻止它这样做。

例如:

av = p.pop()
bv = p.pop()
if a < av and b < bv:
    pass

或者:

av, bv = p.pop(), p.pop()
if a < av and b < bv:
    pass

此外,这些示例中没有浪费内存。在Python中,几乎所有的事情都是通过引用来完成的。被弹出的值对象已经存在于某处。甚至像字符串、整数等标量也是对象(其中一些略有优化)。这里唯一的内存变化是(1)创建一个引用同一个现有对象的新变量,以及(2)同时删除字典中的记录(在弹出之前引用该对象)。它们的规模相似。

如果条件是布尔值,就像在您的示例中一样,您可以改用 &

>>> a, b, p = 1, 1, [0, 0]
>>> (a < p.pop()) & (b < p.pop())
False
>>> p
[]