python - 为什么将值存储在变量中会对幂运算符产生影响
问题描述
为什么我将值存储在指数运算符的变量中(在 python 3.6 中测试)很重要?
>>> -7**2
-49
>>> y=-7
>>> y**2
49
第一个明显错了!
解决方案
你是一种叫做operator priority的受害者。
在 Python 中,运算符基本上是函数。然而,与通常的函数调用不同,它总是带有一对括号来表示函数中的内容,运算符没有。因此,需要一个定义良好的规则列表,这些规则会影响包括运算符在内的表达式的解析方式。
例如,如果您1 + 2 * 3
天真地从左到右阅读,您会期望得到 的答案9
,而不是数学上正确的7
。为了获得正确的结果,*
被定义为具有比更高的优先级+
。这导致在表达式中插入一对隐式括号,将其更改为1 + (2 * 3)
.
另一种看待这个问题的方法是查看运算符是如何被翻译的 具有更高优先级的运算符更早地绑定到它们的参数。所以,回到前面的例子,首先*
绑定到2
and 3
,所以我们得到1 + *(2, 3)
. 只有这样才能+
绑定,这给出了+(1, *(2, 3))
.
回到你原来的问题:你得到不同结果的原因是幂运算符 ,**
比一元否定运算符 , 具有更高的优先级-
。因此,7 ** 2
首先执行,它给出49
,然后否定给出-49
。
相反,当您执行 时y = -7
,您首先评估一元否定。下一个表达式就是(-7) ** 2
,当然是49
。
推荐阅读
- python-3.x - 使用 Python 从 Clearbit api 中提取信息
- r - 如何在 R 中“填充”不同行中的一系列值?
- c - C 游戏和矩阵
- java - 多个服务器实例中的 Spring Boot REST 服务 HTTPS
- python - 有没有办法用(SW1 + 当前时间和日期)命名工作表名称?我得到了我想要的名称的 xlsx 文件
- python - 如何有效地压缩内存中的帧?
- c++ - 将窗口或图像发送到 USB 显示设备 C++
- asp.net-web-api - 如何使用 Swashbuckle 实现 OpenAPI 只读和只写
- javascript - FormData 未提交
- java - Mac 上的进度条样式