为什么 "**" 的优先级高于否定?

10 投票
5 回答
911 浏览
提问于 2025-04-15 11:58

我最近遇到了一个让我困惑的情况:

>>> -1 ** 2
-1

我查了一下Python的文档,发现这是预期的行为,但是为什么会这样呢? 我平时不使用其他语言的幂运算符,所以感觉一元负号的优先级没有那么高,这让我觉得有点不太直观。

这样设计是有什么原因吗?其他有幂运算符的语言也是这样吗?

5 个回答

3

如果让我猜的话,这可能是因为有了指数运算符,程序员可以很方便地把数字提高到分数次方。负数提高到分数次方通常会出现虚数部分,所以为了避免这种情况,**的优先级比一元负号-要高。大多数编程语言都不喜欢虚数。

当然,归根结底,这只是一个约定——为了让你自己和其他人将来能更容易理解你的代码,你可能需要明确地把(-1)分组,这样就不会让别人掉进同样的陷阱里了 :) 祝你好运!

5

简单来说:这是数学中运算优先级的标准规则。

假设我想计算这个多项式 3x3 - x2 + 5。

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

这样看起来比...

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

要好看得多。而且第一种写法是数学家们常用的方式。其他有指数运算的编程语言也是这样处理的。需要注意的是,负号的优先级比乘法低,所以

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

这也是数学中常用的处理方式。

23

这个行为和数学公式是一样的,所以我不太明白问题出在哪里,或者为什么会让人觉得不直观。你能解释一下你在哪里看到过不同的情况吗?“**”的优先级总是比“-”高:-x^2 和 (-x)^2 是不一样的。

就像在数学里一样,直接用 (-1) ** 2 就可以了。

撰写回答