运算符pow()返回的值与**不同

时间:2019-10-16 23:07:23

标签: python python-3.x

这里遇到一个奇怪的问题,其中python的operator.pow返回的值与**不同

import operator
pow(-5,0.333)
>> (0.856078889075021+1.4791926873843961j)

-5**0.333
>> -1.709058826000847

我在这里想念什么?我需要说-1.709而不是复数才能与我的其余代码结构一起工作。

1 个答案:

答案 0 :(得分:3)

在Python中,幂运算符**的绑定比左侧的一元运算符更紧密;它比右边的一元运算符绑定得更紧密(请参见docs)。

因此,与pow(-5, 0.333)的正确等价为(-5)**0.333。与-5**0.333的正确当量为-pow(5, 0.333)

您可以使用抽象语法树分析/转储来验证运算符的优先级:

>>> import ast
>>> ast.dump(ast.parse("-5**0.333"), annotate_fields=False)
'Module([Expr(UnaryOp(USub(), BinOp(Num(5), Pow(), Num(0.333))))])'
>>> astdump.indented("-5**0.333")  # pip install astdump
Module
  Expr
    UnaryOp
      USub
      BinOp
        Num
        Pow
        Num