使用python的**运算符和*运算符时签名

时间:2015-10-24 04:51:26

标签: python python-2.7 math sign

>>> -5**4
-625
>>> -5*-5*-5*-5
625

即使我们做同样的事情,也有这个标志问题。谁能解释为什么会这样呢?

1 个答案:

答案 0 :(得分:5)

根据Operator precedence table,一元否定的优先级低于**运算符。这就是为什么首先计算5**4然后应用一元否定的原因。

因此,表达式-5**4的评估为-(5 ** 4),即-(625)

相反,首先评估-5,然后应用取幂(**)运算符,您将得到预期的结果

>>> -5**4
-625
>>> (-5)**4
625

要查看内部实际发生的情况,可以将表达式拆分为两部分。将4分配给变量并在表达式中使用它,然后反汇编字节代码

>>> dis(compile('a=4;-5**a', 'string', 'exec'))
  1           0 LOAD_CONST               0 (4)
              3 STORE_NAME               0 (a)
              6 LOAD_CONST               1 (5)
              9 LOAD_NAME                0 (a)
             12 BINARY_POWER        
             13 UNARY_NEGATIVE      
             14 POP_TOP             
             15 LOAD_CONST               2 (None)
             18 RETURN_VALUE        

正如我们在此处看到的,首先5和变量a的值用于BINARY_POWER操作,UNARY_NEGATIVE应用于其结果。

但是,当你首先评估-5时,

>>> dis(compile('a=4;(-5)**a', 'string', 'exec'))
  1           0 LOAD_CONST               0 (4)
              3 STORE_NAME               0 (a)
              6 LOAD_CONST               1 (-5)
              9 LOAD_NAME                0 (a)
             12 BINARY_POWER        
             13 POP_TOP             
             14 LOAD_CONST               2 (None)
             17 RETURN_VALUE        

BINARY_POWER操作在-5上完成,值在变量a上完成。