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()
内置函数以某种方式模拟 and
和 or
运算符。两者都将可迭代的布尔值作为参数。如果你给它一个文字元组或列表,所有成员将被完全评估:
# 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
[]
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()
内置函数以某种方式模拟 and
和 or
运算符。两者都将可迭代的布尔值作为参数。如果你给它一个文字元组或列表,所有成员将被完全评估:
# 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
[]