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():
一种方法是先检查条件,然后比较布尔值。但这会浪费记忆力。
答案 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()
内置函数以某种方式模拟and
和or
运算符。两者都采用可迭代的布尔值的值作为参数。如果你给它一个文字元组或列表,所有成员都要被完全评估:
# 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中的记录(在弹出之前引用该对象)。它们具有相似的规模。