D.2 整数
在3.x和其他版本中,有关它们的类型、字面量和整数除法操作,Python的整数面临了几个变化。接下来逐个描述这些变化,并着重强调2.6版本和更新版本在版本迁移中的角色。
D.2.1 单整数类型
以前版本的Python中有两种整数类型int和long。原来int型的大小根据代码运行的平台架构(即 32 位、64 位)有所限制;除了受操作系统提供的虚拟内存大小的影响之外,long型在大小上是无限制的。Python 2.2开始将这两种类型统一为单个int类型,并且将在3.0版本 [1]中完成。而新型的单int类型在大小上将是无限制的,而long型的前置L或l标志被移除。可以在PEP 237中阅读关于这种变化的更多信息。
从版本2.6开始,除了对后置L的支持外,已经没有了long整数的痕迹。包含它出于后向兼容性的目的,以此支持所有使用long整数的代码。然而,用户应该积极从现有代码中清除long整数,并且不应该在任何针对Python 2.6+版本的新代码中再使用它。
D.2.2 新型二进制和改进的八进制字符
Python 3中对整数可替代的基础格式进行了微小修改。它从根本上将其语法变得流线型,以使它与现有的十六进制格式保持一致,即以0x为前缀(或者0X大写字母),例如0x80、0xffff、0xDEADBEEF。
一种新型的二进制字面量使你能够为一个整数提供各个位,以0b为前缀(如0b0110)。原始的八进制表示方式以单个0为前缀,但事实证明这种格式对一些用户来说比较混乱,所以它已经更改为0o,以此将它与十六进制和二进制字面量对应,正如前面所描述的。换句话说,将不再允许0177这种表示方式,而必须使用0o177这种格式。下面是一些例子。
Python 2.x
>>> 0177
127
Python 3(包括2.6+)
>>>0o177
127
>>>0b0110
6
新型二进制和改进的八进制字面量格式都移植到了 2.6 版本来帮助迁移。事实上,作为转换工具的角色中,2.6和更新版本同时接受两种八进制格式,而任何3.x版本都不接受旧版的0177格式。可以在PEP 3127中找到有关整型字面量更新的更多信息。
D.2.3 经典除法或真除法
虽然改变已经存在了很长一段时间,然而对除法运算符(/)的改变仍有很多争议。传统的除法运算符以下面的方式工作:给定两个整型操作数,“/”执行整数向下除法。如果两者中至少有一个浮点数,那就执行真除法。
Python 2.x:经典除法
>>> 1 / 2 # floor
0
>>> 1.0 / 2.0 # true
0.5
>>> 1.0 / 2 # true (2在内部强制转换成浮点数)
0.5
在Python 3中,运算符“/”将始终返回一个浮点数,无论操作数类型是什么。
Python 3.x:真除法
>>> 1 / 2 # true
0.5
>>> 1.0 / 2 # true
0.5
Python 2.2中增加了双斜线除法运算符(//)作为一个代理总是执行向下除法,无论操作数类型是什么都将开始转换过程。
Python 2.2+和3.x:向下除法
>>> 1 // 2 # floor
0
>>> 1.0 //2 # floor
0.0
在3.x版本中,使用“//”将是唯一获取向下除法功能的方式。为了在Python 2.2+中尝试真除法,可以添加一行“fromfutureimport division”到代码中,或者使用“-Q”命令行选项(稍后讨论)。
Python 2.2+:除法命令行选项
如果你不希望从future模块中导入division到代码中,但是你又想经常执行真除法,那么你可以使用“-Qnew”开关。此外,还有其他选项来使用“-Q”,如表 D-1所示。
表D-1 除法操作-Q命令行选项
例如,Python源代码发行版中发现的Tools/scripts/fixdiv.py脚本中就使用了“-Qwarnall”选项。
可能现在你已经猜到了,因为所有的转换工作已经在 Python 2.2中实现了,并且考虑到Python 3的移植以及已经添加了命令行,所以Python 2.6或2.7中并没有添加特定的附加功能。表D-2总结了各种Python发行版中的除法运算符及它们的功能。
表D-2 不同Python发行版中默认除法运算符功能
① 利用-Qnew选项或导入future.division,“3.x”列也适用于Python 2.2+。
可以在PEP 238中阅读有关除法运算符变化的更多信息,也可以阅读题目为“Keeping Up with Python:The2.2 Release”的文章,这篇文章是我在2002年7月份在Linux Journal上发表的。
