69

当我在 python 中输入前面带有 0 的小整数时,它们会给出奇怪的结果。为什么是这样?

>>> 011
9
>>> 0100
64
>>> 027
23

我正在使用 Python 2.7.3。我已经在 Python 3.0 中对此进行了测试,显然现在这是一个错误。所以它是特定于版本的。

它们显然仍然是整数:

>>> type(027)
<type 'int'>
4

9 回答 9

78

这些是以 8 为基数(八进制数)表示的数字。一些例子:

Python 2(旧格式)

注意:这些表单仅适用于 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(新格式)

在 Python 3 中,必须使用0o而不是仅仅0表示八进制常量,例如0o11or0o27等​​。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。

于 2012-07-23T20:40:01.187 回答
46

在 Python 2(和其他一些编程语言)中,这些表示八进制数

在 Python 3 中,011不再起作用,您可以使用它0o11

作为对编辑的回应:它们是常规整数。它们只是以不同的方式指定;并且它们被 Python 自动转换为内部整数表示(实际上是 base-2,因此两者9011都在内部转换为0b1001)。

于 2012-07-23T20:41:33.370 回答
10

八进制数字系统中的数字。其他前缀0x用于十六进制和0b二进制。

于 2012-07-23T20:40:51.363 回答
10

Python 版本 2 和 3 都理解用前导 '0o' 和 '0O'(大写 o)编写的八进制,因此在使用 Python 2.x 时也要养成使用 if 的习惯。

仅在字符串中的数字中使用前导零。

您可以使用 int() 转换来自任何其他基本系统的整数。

>>> int(0o20)

16

如果您希望您的输出以前导零显示,请按照以下答案定义它: Display number withleading zeros

如果您打算使用邮政编码,最好在所有方面都将它们视为字符串。

于 2016-08-02T04:38:17.317 回答
6

这些是八进制数(以 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)。

于 2012-07-23T20:40:29.617 回答
4

这很容易。它们是八进制数。

http://en.wikipedia.org/wiki/八进制

还有一些以 开头的数字0x。它们是十六进制数:

>>> 0x51
81
于 2012-07-23T20:40:08.580 回答
2

它们显然是八进制(以 8 为基数)数字,而 0 只是 Python 2 过去使用的过时前缀。

在 Python 3 中,您必须0o11改为:。

它们仍然是整数,但对它们进行操作会以常规的 base-10 形式给出结果。

于 2012-07-25T16:10:18.007 回答
0

我已经试过了。我学到了一点。从 Java 中,我知道这是一个陷阱:前导零引入了八进制数。我有同事没有回应。不知道经过多年的Java经验。

现在我很感兴趣 Python 中的行为是什么。我很欣赏从 Python 2 到 Python 3 的变化。这是一个陷阱,我一直不明白为什么 Java(一种专注于“简单易用”的年轻语言)可以从 C 中接管那个愚蠢的解决方案。

可能会意外键入前导零作为前缀(错误的解决方案)。永远不会意外键入十六进制数的 0x(好的解决方案)。但是 0 和 o 相似,因此我认为 Python 中的 0o23 不是一个完美的解决方案。在我看来, 0c23 (oc tal ) 将是一个更好的解决方案。

于 2018-08-04T08:49:32.927 回答
0

数字文字的最新 Python 规范在PEP-3127 "Integer Literal Support and Syntax"中

011 的语法已在 Python 3.0 中删除。0o11 的语法已在 Python 2.6 中添加,它是 Python 3.0 之后唯一支持的语法。Python 2 中没有__future__导入会禁止或至少警告带有前导零的数字文字,因此开发人员必须知道 011 的含义以及应该避免它(并且实际上可以避免它)。

于 2018-09-12T21:13:53.517 回答