为什么Python 2仅使用'/'作为整数除法?

时间:2017-02-22 00:26:21

标签: python

我注意到Python 2.7使用'/'作为整数除法。

>>> print 1/2
0

由于Python是一种动态类型的语言,这有点令人惊讶。 是否有一个特定的原因,为什么Python的'/'运算符是这样定义的?

3 个答案:

答案 0 :(得分:3)

Python 2的/运算符 整数或浮点数,具体取决于操作数的类型。

>>> print 1.0/2
0.5

答案 1 :(得分:3)

语言设计"为什么" s一般都是难以回答的问题,尽管Guido可能会在这里告诉你答案。我怀疑它只是因为"它的完成方式"。更具体地说,因为C语言的划分是如何运作的,这在很多方面不仅是Python的母语,而且是大多数其他现代命令式语言的母语。当然,C从B和BCPL获得它,如果你继续跟踪,你会发现这种特殊的分裂行为会一直回到Fortran。

然而,所讨论的行为并非始终是整数除法"。就像在C和Fortran等中一样,Python 2的/而不是整数除法,除非其操作数都是整数:

>>> 1/2
0
>>> 1.0/2
0.5

这个事实意味着如果参数是表达式而不是文字,你就无法判断结果是否会被截断,这可能会导致混淆。这种不明确的原因是操作符在Python 3中被更改为始终执行浮动除法,并且//运算符被引入以始终执行截断除法。在Python 2.2+中,可以从__future__伪模块导入这些更改作为功能division

答案 2 :(得分:2)

这只是一次历史性事故。他们这样做,可能是因为那时它在其他主流语言中的表现方式。许多其他语言都是静态类型的,并且没有立即意识到期望的差异。

但是没有更多的理由可以帮助解释你的惊喜。现在,除了Python维护者之外,除法运算符的这种行为被认为是一个错误,并且已经针对Python 3进行了更改。唯一的原因是它在Python 2中仍然采用这种方式来避免改变现有代码的行为(参见https://www.python.org/dev/peps/pep-0238/)。

您可以将此行添加到Python文件的顶部:

from __future__ import division

在整个模块中重新定义除法运算符,使其始终执行" true"除法(//作为整数除法的运算符)。我基本上把它放在我使用除法的任何模块中。