当我在 python 中输入前面带有 0 的小整数时,它们会给出奇怪的结果。为什么是这样?
>>> 011
9
>>> 0100
64
>>> 027
23
我正在使用 Python 2.7.3。我已经在 Python 3.0 中对此进行了测试,显然现在这是一个错误。所以它是特定于版本的。
它们显然仍然是整数:
>>> type(027)
<type 'int'>
当我在 python 中输入前面带有 0 的小整数时,它们会给出奇怪的结果。为什么是这样?
>>> 011
9
>>> 0100
64
>>> 027
23
我正在使用 Python 2.7.3。我已经在 Python 3.0 中对此进行了测试,显然现在这是一个错误。所以它是特定于版本的。
它们显然仍然是整数:
>>> type(027)
<type 'int'>
这些是以 8 为基数(八进制数)表示的数字。一些例子:
注意:这些表单仅适用于 Python 2.x。
011
等于 1⋅8¹ + 1⋅8⁰ = 9,
0100
等于 1⋅8² + 0⋅8¹ + 0⋅8⁰ = 64,
027
等于 2⋅8¹ + 7⋅8⁰ = 16 + 7 = 23。
在 Python 3 中,必须使用0o
而不是仅仅0
表示八进制常量,例如0o11
or0o27
等。Python 2.x 版本 >= 2.6 支持新旧格式。
0o11
等于 1⋅8¹ + 1⋅8⁰ = 9,
0o100
等于 1⋅8² + 0⋅8¹ + 0⋅8⁰ = 64,
0o27
等于 2⋅8¹ + 7⋅8⁰ = 16 + 7 = 23。
在 Python 2(和其他一些编程语言)中,这些表示八进制数。
在 Python 3 中,011
不再起作用,您可以使用它0o11
。
作为对编辑的回应:它们是常规整数。它们只是以不同的方式指定;并且它们被 Python 自动转换为内部整数表示(实际上是 base-2,因此两者9
和011
都在内部转换为0b1001
)。
八进制数字系统中的数字。其他前缀0x
用于十六进制和0b
二进制。
Python 版本 2 和 3 都理解用前导 '0o' 和 '0O'(大写 o)编写的八进制,因此在使用 Python 2.x 时也要养成使用 if 的习惯。
仅在字符串中的数字中使用前导零。
您可以使用 int() 转换来自任何其他基本系统的整数。
>>> int(0o20)
16
如果您希望您的输出以前导零显示,请按照以下答案定义它: Display number withleading zeros
如果您打算使用邮政编码,最好在所有方面都将它们视为字符串。
这些是八进制数(以 8 为底,值 0 - 7)
您可以使用oct()函数将十进制数转换为八进制数。
In [125]: for i in range(10):
.....: print '{:5} {:5}'.format(i, oct(i))
.....:
0 0
1 01
2 02
3 03
4 04
5 05
6 06
7 07
8 010
9 011
并使用具有适当基数的int()函数将八进制值转换为整数(在本例中为 8):
int(str(17), 8)
Out[129]: 15
类似的规则/函数集适用于使用hex()函数的十六进制数(基数 16)。
它们显然是八进制(以 8 为基数)数字,而 0 只是 Python 2 过去使用的过时前缀。
在 Python 3 中,您必须0o11
改为:。
它们仍然是整数,但对它们进行操作会以常规的 base-10 形式给出结果。
我已经试过了。我学到了一点。从 Java 中,我知道这是一个陷阱:前导零引入了八进制数。我有同事没有回应。不知道经过多年的Java经验。
现在我很感兴趣 Python 中的行为是什么。我很欣赏从 Python 2 到 Python 3 的变化。这是一个陷阱,我一直不明白为什么 Java(一种专注于“简单易用”的年轻语言)可以从 C 中接管那个愚蠢的解决方案。
可能会意外键入前导零作为前缀(错误的解决方案)。永远不会意外键入十六进制数的 0x(好的解决方案)。但是 0 和 o 相似,因此我认为 Python 中的 0o23 不是一个完美的解决方案。在我看来, 0c23 (oc tal ) 将是一个更好的解决方案。
数字文字的最新 Python 规范在PEP-3127 "Integer Literal Support and Syntax"中
011 的语法已在 Python 3.0 中删除。0o11 的语法已在 Python 2.6 中添加,它是 Python 3.0 之后唯一支持的语法。Python 2 中没有__future__
导入会禁止或至少警告带有前导零的数字文字,因此开发人员必须知道 011 的含义以及应该避免它(并且实际上可以避免它)。