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

时间:2012-07-23 20:38:19

标签: python python-2.x

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

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

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

编辑:他们显然仍然是整数:

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

9 个答案:

答案 0 :(得分:51)

这些是以基数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.

答案 1 :(得分:43)

在Python 2(以及一些其他编程语言)中,这些语言代表octal numbers

在Python 3中,011不再有效,您可以使用0o11代替。

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

答案 2 :(得分:8)

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

答案 3 :(得分: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)。

答案 4 :(得分:6)

Python版本2和版本2 3了解八进制与领先&#39; 0&#39;和&#39; 0&#39; (大写字母o),因此在使用Python 2.x时也习惯使用if。

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

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

>>> int(0o20)

16

如果您希望输出显示前导零,则根据此答案定义它: Display number with leading zeros

如果您打算使用邮政编码,最好将其视为字符串。

答案 5 :(得分:4)

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

http://en.wikipedia.org/wiki/Octal

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

>>> 0x51
81

答案 6 :(得分:2)

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

在Python 3中,你必须写:0o11而不是。

它们仍然是整数,但对它们进行操作会产生常规的10-base表格。

答案 7 :(得分:0)

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

现在,我很有趣的是Python中的行为。我很欣赏从Python 2到Python 3的转变。这是一个陷阱,我从未理解过Java为什么可以成为一种愚蠢的解决方案,而Java却是Java的主要目标。

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

答案 8 :(得分:0)

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

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