python - 为什么`0--3//2`和`--3//2`之间有区别?
问题描述
我正在弄清楚如何在没有math
模块的情况下进行地板/天花板操作。我通过使用 floor division 解决了这个问题//
,并发现否定“给出了天花板”。所以这有效:
>>> 3//2
1
>>> -3//2
-2
我希望答案是肯定的,所以首先我尝试--3//2
了 ,但这给出了 1。我推断这是因为 Python 的计算结果--
为+
。所以为了解决这个问题,我发现我可以使用-(-3//2))
,问题解决了。
但是我找到了另一个解决方案,即(我包含了前面的示例进行比较):
>>> --3//2 # Does not give ceiling
1
>>> 0--3//2 # Does give ceiling
2
我无法解释为什么包括 0 有帮助。我已阅读有关部门的文档,但在那里没有找到任何帮助。我认为这可能是因为评估顺序:
如果我用--3//2
这个例子作为例子,从我所拥有的文档Positive, negative, bitwise NOT
中,这个例子中最严格的,我猜这评估--
为+
. 接下来是Multiplication, division, remainder
,所以我猜这是+3//2
评估为 的1
,我们完成了。我无法从文档中推断出为什么 include0
应该改变结果。
参考:
解决方案
Python 使用该符号-
作为一元( -x
) 和二元( x-y
) 运算符。这些具有不同的运算符优先级。
具体来说,顺序//
是:
- 一元
-
- 二进制
//
- 二进制
-
通过引入0
as 0--3//2
,第一个-
是二进制文件 -
,最后应用。没有前导0
as --3//2
,两者-
都是一元的并且一起应用。
对应的评估/语法树大致是这样的,先评估底部的节点,然后在父节点中使用它们:
---------------- ----------------
| --3//2 | 0--3//2 |
|================|================|
| | ------- |
| | | 0 - z | |
| | -----+- |
| | | |
| -------- | ----+--- |
| | x // y | | | x // y | |
| -+----+- | -+----+- |
| | | | | | |
| ----+ +-- | ---+ +-- |
| | --3 | | 2 | | | -3 | | 2 | |
| ----- --- | ---- --- |
---------------- ----------------
因为一元-
是一起应用的,所以它们抵消了。相反,一元和二元-
分别在除法之前和之后应用。
推荐阅读
- r - 在数据框上运行 T.test 并将结果按 col1 和 col3 分组
- java - 字段选择错误 thymeleaf 选择器绑定
- javascript - 试图从数组中弹出元素,但在循环中断之前只有 6 个元素被弹出
- mysql - ECS 上的 Wordpress - 无法连接到 mysql 容器
- jdeveloper - 无法连接到 Internet 以检查 JDeveloper 中的更新
- android - Android firebase:pendingDynamicLinkData 始终为空
- c# - SQLite; 是否有参数每次重写一条记录
- angular - CloneDeep 导致滚动条出现问题
- swift - 你能将 Swift 泛型约束限制为一组已知类型吗?
- r - 如何使用 R 中的循环函数填充表格?