如何在Python中停止短路?

时间:2017-10-03 08:49:20

标签: python logical-operators short-circuiting

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

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

有没有办法阻止这种行为。我希望它检查两个条件,然后执行和操作(如c,c ++等)。当我们与条件一起执行某些操作时,它很有用。 e.g:

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

一种方法是先检查条件,然后比较布尔值。但这会浪费记忆力。

4 个答案:

答案 0 :(得分:8)

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:

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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


# any emulates the or operator
if any((False, Condition2)):
    do_stuff()

答案 3 :(得分:0)

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

例如:

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)同时删除dict中的记录(在弹出之前引用该对象)。它们具有相似的规模。