我注意到Python 2.7使用'/'作为整数除法。
>>> print 1/2
0
由于Python是一种动态类型的语言,这有点令人惊讶。 是否有一个特定的原因,为什么Python的'/'运算符是这样定义的?
答案 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"除法(//
作为整数除法的运算符)。我基本上把它放在我使用除法的任何模块中。