地板除法和普通除法的运算符优先级

6
我不理解为什么Python返回这两条语句不同的结果: -1 // 3/4-1 // 0.75 第一条返回 -0.25,第二条返回 -2
我理解操作符 / 是在 // 前执行的,因此这两个语句应该有相同的结果。
编辑: 这是我学校提供的文档,我的解释是错误的。官方的Python文档证明了我的错误。感谢所有快速回答的人。

你从Python文档中关于这个主题没有理解的地方吗?请引用给你“我理解的方式”的来源。 - Prune
我指的是我的大学提供的一份文件。它说:“在顶部是具有最高优先级的运算符” - 如果您不会讲德语的话。我认为很容易看出我误解了这个文件。参考链接 @Prune - Conwear
完全不容易 :-) :该文档通常不可用。此外,任何源材料都应编辑到您的问题中。无论如何,我认为这是一个无意义的观点:有几个人已经回答了你的问题。 - Prune
你是一款专业的翻译引擎,请将以下与编程有关的内容从英语翻译成中文。只返回翻译后的文本内容,不要进行解释。你提供的链接除非是你们大学的员工或学生,否则其他人都无法访问。 - Sufiyan Ghori
我下次会做得更好。现在我的问题已经得到解答了。谢谢@Prune。 - Conwear
1
这就是我们的初衷。你也做得很对,给有用的帖子点赞并选择一个答案。谢谢。 - Prune
7个回答

7
< p >根据文档///运算符具有相同的优先级,因此在同一表达式中使用时从左到右进行计算。因此,-1 // 3/4等价于(-1 // 3)/4而不是-1 //(3/4)


1
Expressions文档中有一个关于运算符优先级的部分。同一方框中的运算符具有相同的优先级。
因此,该表格告诉您///具有相等的优先级,因此-1 // 3/4被解析为
>>> (-1//3)/4
>>> -0.25

1

从操作顺序角度来看,将它们考虑一下:

-1 // 3/4

这将执行-1的"floor"3,得到-1,然后除以4得到-0.25
而:
-1 // 0.75

这将直接进行“向下取整”操作,得到-2.0

1
我理解的方式是,/ 运算符在 // 之前执行,因此这两个语句应该具有相同的结果。
你的理解是错误的。/// 具有相同的优先级和左结合性,这意味着Python首先执行最左边的操作 - 在您的情况下是 /

1

不,它们具有相同的优先级,因此从左到右进行评估。

-1//3 是四舍五入(至最小整数)的整数除法,因此您得到 -1 除以 4 的结果为:0.25

当您有疑问时,加上一对括号并不会花费太多时间。


1
根据文档,乘法*、矩阵乘法@、除法/、地板除法//和取余%的优先级相同。当两个运算符的优先级相同时,结合性有助于确定操作顺序。现在关于你的问题,/和//具有相同的优先级,如果它们都存在于表达式中,则基于从左到右的结合性首先评估左边的运算符。

0

// 实际上是一个向下取整的运算符。

所以 1 // 0.75 实际上是向下取整 1.333 得到 1

-1 // 0.75 实际上是向下取整 -1.333 得到 -2。

希望这样说清楚了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接