使用python时签名';s**运算符和*运算符

使用python时签名';s**运算符和*运算符,python,python-2.7,math,sign,Python,Python 2.7,Math,Sign,即使我们在做同样的事情,也存在符号问题。有人能解释为什么会发生这种情况吗?根据,一元否定的优先级低于**运算符。这就是为什么首先计算5**4,然后应用一元求反 因此,表达式-5**4计算为,-(5**4),即-(625) 相反,首先计算-5,然后应用求幂(***)运算符,您将得到预期的结果 >>> -5**4 -625 >>> -5*-5*-5*-5 625 要查看内部实际发生的情况,可以将表达式拆分为两部分。将4赋值给变量,并在表达式中使用它,然后反汇编

即使我们在做同样的事情,也存在符号问题。有人能解释为什么会发生这种情况吗?

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

因此,表达式
-5**4
计算为,
-(5**4)
,即
-(625)

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

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

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

>>> -5**4
-625
>>> (-5)**4
625
正如我们在这里看到的,首先
5
和变量
a
处的值用于
二元幂
运算,并对其结果应用
一元负

但是当您首先评估
-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 UNARY_NEGATIVE      
             14 POP_TOP             
             15 LOAD_CONST               2 (None)
             18 RETURN_VALUE        
BINARY\u POWER
操作是在
-5
上完成的,变量
a
上的值是您正在比较的-(5**4)和(-5)**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 POP_TOP             
             14 LOAD_CONST               2 (None)
             17 RETURN_VALUE