当我在前面输入一个前面带有0的小整数时,它们会产生奇怪的结果。这是为什么?
>>> 011
9
>>> 0100
64
>>> 027
23
注意:Python版本2.7.3 我已经在Python 3.0中对此进行了测试,显然现在这是一个错误。所以这是版本特定的。
编辑:他们显然仍然是整数:
>>> type(027)
`<type 'int'>`
答案 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,因此9
和011
都在内部转换为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)
答案 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>