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

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


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

它们显然仍然是整数:

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


#1 楼

这些是以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来表示一个八进制常量,例如0o110o27等。Python2.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。

评论


也许双星号不是陈述指数的最清晰方法。如果它是Stackoverflow标准,或其他地方的标准,则必须进行更改。

– David L
2015年1月6日下午13:47

@DavidL:在Python中,**是指数运算符,^是按位XOR。

–unutbu
2015年1月6日14:05

请注意,在Python 3中,输入011将导致SyntaxError:无效令牌。请改用0o11。

– p3nchan
18-2-24在11:45



@Okmarq您对指数运算符的更改使该代码在Python中不再有效。 **是指数,^是按位XOR。

– Endolith
4月14日15:51

#2 楼

在Python 2(和其他几种编程语言)中,它们表示八进制数。

在Python 3中,011不再起作用,而应使用0o11

编辑:它们是正整数。它们只是以不同的方式指定;并通过Python自动将它们转换为内部整数表示形式(实际上是基数2,因此9011都在内部转换为0b1001)。

#3 楼

Python第2版和第3版都理解八进制以'0o'和'0O'开头(大写o),因此在使用Python 2.x时也应养成使用if的习惯。

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

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

>>> int(0o20)

16


如果您希望输出以前导零显示,请按照以下答案进行定义:
以前导零显示数字

如果您打算使用邮政编码,则最好以各种方式将它们视为字符串。

#4 楼

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

评论


请注意,在Python 3中,不允许前导零,并且八进制必须使用0o。

– Mark Ransom
2012年7月23日在20:42

#5 楼

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

#6 楼

那很容易。它们是八进制数字。

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

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

>>> 0x51
81


#7 楼

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

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

它们仍然是整数,但是使用它们进行运算将得到常规的以10为底的形式。

#8 楼

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

现在,我对Python的行为很感兴趣。我赞赏从Python 2到Python 3的转变。这是一个陷阱,我从未理解过为什么Java(专注于“轻松编程”的年轻语言)可以接管C的愚蠢解决方案。

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

#9 楼

PEP-3127“整数文字支持和语法”中提供了最新的数字文字Python规范。

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