为什么“**”比否定更紧密?

时间:2009-06-01 21:33:08

标签: python operator-precedence

我被以下情况所困扰:

>>> -1 ** 2
-1

现在,挖掘Python文档,it's clear that this is intended behavior,但为什么?我不使用任何其他语言作为内置运算符,但没有一元否定绑定为尽可能紧紧地对我来说是危险的反直觉。

有没有理由这样做?功率运算符的其他语言是否表现相似?

5 个答案:

答案 0 :(得分:22)

这种行为与数学公式相同,所以我不确定问题是什么,或者为什么它是反直觉的。你能解释一下你在哪里看到不同的东西吗? “**”总是绑定多于“ - ”: - x ^ 2与(-x)^ 2不一样

只需使用(-1)** 2,就像在数学中一样。

答案 1 :(得分:4)

简短回答:这是数学中标准的优先顺序。

假设我要评估多项式3x 3 - x 2 + 5.

def polynomial(x):
    return 3*x**3 - x**2 + 5

它看起来比...更好。

def polynomial
    return 3*x**3 - (x**2) + 5

第一种方式是数学家的方式。使用取幂的其他语言也以相同的方式工作。请注意,否定运算符也比乘法更松散地绑定,所以

-x*y === -(x*y)

这也是他们在数学方面的表现方式。

答案 2 :(得分:3)

如果我不得不猜测,那将是因为使用取幂运算符可以让程序员轻松地将数字提升到分数幂。提升到分数幂的负数最终会产生一个虚构的组件(通常),因此可以通过比一元更紧密地绑定**来避免。大多数语言都不喜欢虚数。

最终,当然,这只是一个惯例 - 并且为了让你自己和其他人可以阅读你的代码,你可能想要明确地分组你的(-1)所以没有其他人被相同的陷阱捕获祝你好运!

答案 3 :(得分:1)

对我来说似乎很直观。

拳头,因为它与数学公式一致:-2 ^ 2 = -4。

其次,FORTRAN很久以前就广泛引入了运营商**。在FORTRAN中,-2 ** 2也是-4。

答案 4 :(得分:-1)

Ocaml不做同样的事情

# -12.0**2.0
  ;;
- : float = 144.

那有点奇怪......

# -12.0**0.5;;
- : float = nan

看看那个链接虽然...... order of operations