2017-02-22 72 views
-4

我注意到Python 2.7使用'/'作为整数除法。为什么Python 2只用'/'作为整数除法?

>>> print 1/2 
0 

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

+0

Python 3使用'/'进行浮点除法。所以我猜他们在某个时候改变了主意。 –

+0

简而言之,正如链接副本的顶部答案所说:因为C做到了。 – TigerhawkT3

回答

3

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

>>> print 1.0/2 
0.5 
3

语言设计“为什么”是很难回答的问题,尽管圭多可能会在这里告诉你答案。我怀疑这只是因为“这是它完成的方式”。更具体地说,因为这就是C的分工工作方式,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

+0

啊,谢谢你的解释。 – subwaymatch

+0

Python历史上试图遵循C标准肯定会是原因。 Python变得越来越复杂,今天就不那么容易了。 – SpliFF

2

这只是一个历史事故。他们这样做,可能是因为这是当时在其他主流语言中常用的方式。许多其他语言都是静态类型的,期望值的差异并未立即得到认可。

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

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

from __future__ import division 

重新定义除法运算符在整个模块,这样就总是执行“真”师(与//作为运营商的整数师)。我基本上把它放在我使用除法的任何模块中。

+0

感谢您与PEP的链接。很有帮助! – subwaymatch

相关问题