【问题标题】:Python - Shortcircuiting strange behaviourPython - 短路奇怪的行为
【发布时间】:2016-07-17 07:17:03
【问题描述】:

在以下代码片段中,函数f按预期执行:

def f():
  print('hi')
f() and False
#Output: 'hi'

但在以下类似的代码片段中a 不会递增:

a=0
a+=1 and False
a
#Output: 0

但是如果我们用 True 而不是 False 短路 a 会增加:

a=0
a+=1 and True
a
#Output: 1

短路如何使它以这种方式运行?

【问题讨论】:

    标签: python short-circuiting


    【解决方案1】:

    这是因为f() and False 是一个表达式(技术上是一个单表达式语句),而a += 1 and False 是一个赋值语句。它实际上解析为a += (1 and False),并且由于1 and False 等于False 并且False 实际上是整数0,所以会发生a += 0,一个无操作。

    然而,(1 and True) 的计算结果为 True(即整数 1),因此 a += 1 and True 表示 a += 1

    (另请注意,Python 的andor 总是返回它们的第一个可以明确确定操作结果的操作数)

    【讨论】:

    • 有必要澄清一下“(1 and True) 的计算结果为 True,它是整数 1。”
    • 不应该将a += 1 and False 解析为a = (a + 1) and False,因为+ 运算符有higher precedence,那么整个表达式解析为a = False
    • 不,因为+= 不是运算符,它是一个赋值指令(语句,而不是表达式)。假设 __iadd__ 未被覆盖,a += b 首先计算 a,然后计算 b,然后将两者相加并将结果重新分配给 a
    【解决方案2】:

    我相信

    a+=1 and False
    

    等价于

    a+=(1 and False)
    

    a+=1 and True
    

    等价于

    a+=(1 and True)
    

    例如:

    In [15]: a = 0
    
    In [16]: a+=2 and True
    
    In [17]: a
    Out[17]: 1
    

    【讨论】:

    • 是的,就是这样。在 python 中赋值不会像在 C 中那样返回值。
    猜你喜欢
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 2017-09-01
    • 2016-09-25
    • 2017-08-06
    相关资源
    最近更新 更多