Python运算符优先级

Lor*_*ish 9 python expression operator-precedence

Python文档说*和/具有相同的优先级.
我知道python中的表达式是从左到右计算的.

我可以依赖它并假设j j/m总是等于(j j)/ m,避免使用括号吗?
如果是这种情况,我可以假设这适用于一般具有相同优先级的运营商吗?


ps:问题因为它对我的目的来说很好,我在阅读整数代码(如上例)而没有括号的时候来到它,当时我看起来很可疑.

Amb*_*ber 14

是 - 具有相同优先级的不同运算符是左关联的; 也就是说,最左边的两个项目将被操作,然后是结果和第三个项目,依此类推.

**运营商例外:

>>> 2 ** 2 ** 3
256
Run Code Online (Sandbox Code Playgroud)

此外,比较运算符(==,>等等)不以关联方式运行,而是转换x [cmp] y [cmp] z(x [cmp] y) and (y [cmp] z).

  • 赋值实际上不是Python中的表达式,而`=`不是正常意义上的运算符; 运算符优先级不适用.在语法中明确定义了多个目标的赋值,准确地说:将同一个对象分配给多个目标. (6认同)
  • 关于任务错误,请改变示例!Python中唯一一个从右到左关联的运算符是"**",就像在"2**3**4"中一样 (2认同)

msw*_*msw 13

但是,如果它对你来说是模糊的 - 编码器 - 它必须是因为你必须要求,然后期望它至少对读者来说是模棱两可的并且为了清晰而浪费几个八位字节.

如果您恰好是编译器,依赖优先级规则是很好的.

添加了对评论的回复:

对于阅读代码时遇到歧义而需要外部咨询以保证的人,您应该假设下一位读者不会比您更精明,并且为解析相同构造并为其添加括号而省去他们的努力和可避免的人为错误.

事实上,即使是接受的答案也是不正确的(在理论上,没有效果,看到它的第一个评论)我并不知道,也不是那些赞成它的人的一小部分.

至于关于基本代数的陈述,OP中使用的特定示例是有益的.无论运算符优先级如何,表达式j * (j / m)在代数上都是相同的(j * j) / m.不幸的是,Python的代数仅仅是"柏拉图式理想的"代数这可能会产生不正确的答案为依据的大小两种形式的近似jm.例如:

>>> m = 1e306
>>> m
1e+306
>>> j = 1e307
>>> j
9.9999999999999999e+306
>>> j / m
10.0
>>> j*j
inf
>>> j * (j / m)
1e+308
>>> (j * j) / m
inf
>>> ((j * j) / m) == (j * (j/m))
False
Run Code Online (Sandbox Code Playgroud)

事实上,Python(和我的FPU)准代数的身份属性确实不成立.根据文档说明,您的机器可能会有所不同:

浮点数在C中使用double实现.除非您碰巧知道正在使用的机器,否则所有关于其精度的投注都将关闭.

可以说,一个人没有业务在溢出的毛边上工作,这在某种程度上是正确的,但是从上下文中删除表达式在给定一个操作顺序时是不确定的并且在另一个操作下是"正确的".

  • 为什么你认为我正在尝试编写代码?如果...我想读. (2认同)