【问题标题】:How to stop short circuiting in Python?如何在 Python 中停止短路?
【发布时间】:2018-03-14 10:00:21
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 我保证这里的“浪费”内存不会以任何方式影响您的程序。
  • 内存浪费,不知道这里的内存是如何浪费的。
  • 错误的解决方法:(a&lt;p.pop()) == (b&lt;p.pop()) == True。好的解决方法:将您的 if 语句拆分为多行。
  • 您似乎来自 C 编码领域,并且您正在尝试将 C 范式引入 Python,这可能有效,但也可能被视为反模式。条件检查的副作用是 Python 中的这种反模式。
  • C 语言也会“短路”。

标签: python logical-operators short-circuiting


【解决方案1】:
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:

【讨论】:

    【解决方案2】:

    如果条件是布尔值,如您的示例所示,您可以改用 &amp;

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

    【讨论】:

      【解决方案3】:

      您可以使用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()
      

      【讨论】:

        【解决方案4】:

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

        例如:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-06-07
          • 2021-11-23
          • 2012-08-30
          • 2018-06-22
          • 2016-01-01
          • 1970-01-01
          • 2019-08-05
          相关资源
          最近更新 更多