在Python中,以0开头的数字是什么意思?

What do numbers starting with 0 mean in python?

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

1
2
3
4
5
6
>>> 011
9
>>> 0100
64
>>> 027
23

注:python版本2.7.3我在python 3.0中测试过这个,显然这是一个错误。所以它是特定于版本的。

编辑:它们显然还是整数:

1
2
>>> type(027)
`<type 'int'>`

这些数字以8为基数(八进制数字)表示。例如,

011等于1*(8**1) + 1*(8**0)=9,

0100等于1*(8**2) + 0*(8**1) + 0*(8**0)=64,

027等于2*(8**1) + 7*(8**0)=16+7=23。


在python 2(以及其他一些编程语言)中,它们表示八进制数。

在python 3中,011不再有效,而是使用0o11

作为对编辑的响应:它们是规则整数。它们只是以不同的方式指定的;它们由python自动转换为内部整数表示(实际上是基2,因此9011都在内部转换为0b1001)。


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


两个python版本2&3都理解以"0o"和"0o"(大写O)开头的八进制,因此在使用python 2.x时也要习惯使用if。

字符串中的数字只能使用前导零。

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

>>> int(0o20)

1
16

如果希望输出以前导零显示,则根据此答案定义它:带前导零的显示数字

如果您曾经计划使用邮政编码,那么最好在所有方面将其视为字符串。


这些是八进制数(以8为基数,值为0-7)

您可以使用oct()函数将十进制数转换为八进制数。

1
2
3
4
5
6
7
8
9
10
11
12
13
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):

1
2
int(str(17), 8)
Out[129]: 15

类似的规则/函数集也适用于使用hex()函数的十六进制数(以16为基数)。


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

网址:http://en.wikipedia.org/wiki/octal

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

1
2
>>> 0x51
81


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

在python 3中,您必须编写:0o11

它们仍然是整数,但是用它们进行运算会得到正规的基10形式的结果。


最新的数字文本python规范在PEP-3127"整数文本支持和语法"中。

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


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

现在我很感兴趣的是Python的行为是什么。我很欣赏从python 2到python 3的变化。这是陷阱,我从来没有理解为什么Java(一个年轻的语言,专注于"轻松")可以接管从C的愚蠢的解决方案。

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