如果将值存储在指数运算符的变量中(在python 3.6中进行了测试),为什么有关系?
>>> -7**2
-49
>>> y=-7
>>> y**2
49
第一个显然是错误的!
答案 0 :(得分:1)
您是运算符优先级的受害者。
在Python中,运算符基本上是函数。但是,与通常带有一对表示该函数内容的方括号不同的是,运算符没有。因此,需要a list of well-defined rules来影响如何解析包含运算符的表达式。
例如,如果您天真地从左到右阅读1 + 2 * 3
,那么您会期望得到9
的答案,而不是数学上正确的7
。为了获得正确的结果,*
被定义为具有比+
高的优先级。这导致将一对隐式括号插入表达式中,将其更改为1 + (2 * 3)
。
查看此问题的另一种方法是查看运算符如何被翻译优先级更高的运算符更早地绑定到其参数。因此,回到前面的示例,*
首先绑定到2
和3
,所以我们得到1 + *(2, 3)
。只有这样+
才会绑定,从而得到+(1, *(2, 3))
。
回到最初的问题:得到不同结果的原因是,求幂运算符**
的优先级高于一元否定运算符-
。因此,首先执行7 ** 2
,得到49
,然后然后取反,得到-49
。
相反,当您执行y = -7
时,您首先要评估一元否定。然后,下一个表达式就是(-7) ** 2
,当然是49
。