我很难理解为什么python对于这2条语句返回不同的结果:
-1 // 3/4
和-1 // 0.75
第一个返回-0.25
,第二个返回-2
。
按照我的理解,/
运算符在//
之前执行,因此这2条语句应具有相同的结果。
编辑: 我指的是大学提供的文件。我误解了。官方的python文档证明我错了。 感谢您的所有快速解答。
答案 0 :(得分:5)
/
和//
运算符根据documentation具有相同的优先级,因此在同一表达式中使用时,它们从左到右进行评估。因此,-1 // 3/4
等效于(-1 // 3)/4
而不是-1 // (3/4)
。
答案 1 :(得分:1)
按照我的理解,
/
运算符在//
之前执行,因此这2条语句应具有相同的结果。
您的理解不正确。 /
和//
的优先级相同,并且具有关联性,这意味着Python首先执行最左边的操作-在您的情况下为/
。
答案 2 :(得分:1)
表达式文档中有关于Operator Precedence的部分。同一框中的运算符具有相同的优先级。
因此,该表告诉您//
和/
具有相同的优先级,因此
-1 // 3/4
解析为
>>> (-1//3)/4
>>> -0.25
答案 3 :(得分:1)
不,它们具有相同的优先级,因此从左到右对其进行评估。
-1//3
被四舍五入(最小整数)整数除法,因此您得到-1
除以4
:0.25
如果您有疑问,只需加上几个括号就可以了。
答案 4 :(得分:1)
从操作顺序的角度考虑这些问题:
-1 // 3/4
这将执行-1
个“底” 3
,产生-1
,然后除以4
产生-0.25
。
位置:
-1 // 0.75
这将直接使操作“底层”并产生-2.0
。
答案 5 :(得分:1)
根据文档,Multiplication *
,matrix multiplication @
,division /
,floor division //
,remainder %
都具有相同的优先级。
当两个运算符的优先级相同时,关联性有助于确定运算顺序。
现在关于您的问题; /
和//
的优先级都相同,并且如果两个表达式中都存在它们,则首先根据从左到右的关联性评估左一个。
答案 6 :(得分:0)
//本质上是地板分割的运算符。
所以1 // 0.75本质上是1.333底线,即1
-1 // 0.75本质上是-1.333的下限,即-2。
希望这很有道理。