10

我只是被以下场景咬了一口:

>>> -1 ** 2
-1

现在,深入研究 Python 文档,很明显这是预期的行为,但为什么呢? 我不使用任何其他具有内置运算符功能的语言,但是没有尽可能紧密地绑定一元否定对我来说似乎是危险的违反直觉的。

这样做是有原因的吗?其他具有幂运算符的语言是否也有类似的行为?

4

5 回答 5

23

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

只需使用 (-1) ** 2,就像您在数学中所做的那样。

于 2009-06-01T21:37:53.410 回答
5

简短的回答:这是数学中优先级的标准方式。

假设我想评估多项式 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)

这也是他们在数学中的做法。

于 2009-06-01T21:43:36.643 回答
3

如果我不得不猜测,那将是因为拥有一个指数运算符可以让程序员轻松地将数字提高到分数幂。负数的分数次幂最终会得到一个虚数分量(通常),因此可以通过将 ** 比一元 - 更紧密地绑定来避免这种情况。大多数语言不喜欢虚数。

最终,当然,这只是一个约定——为了让你的代码对你自己和其他人都可读,你可能想要明确地对你的 (-1) 进行分组,这样其他人就不会被同一个陷阱抓住:) 好运气!

于 2009-06-01T21:39:32.067 回答
1

这对我来说似乎很直观。

拳头,因为它符合数学符号:-2^2 = -4。

其次,运算符**很早以前就被FORTRAN广泛引入。在 FORTRAN 中,-2**2 也是 -4。

于 2009-06-01T21:48:41.797 回答
-1

Ocaml 不做同样的事情

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

这有点奇怪...

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

不过看看那个链接...... 操作顺序

于 2009-06-01T21:44:37.140 回答