我们不能声明一个以0开头的整数。
>>> n = 08
SyntaxError: invalid token
但我们确实声明了一个包含全零的变量。
>>> n = 00000
>>> print n
>>> 0
所以问题在于第一种情况,为什么python不通过忽略左侧的零而不是引发异常来考虑变量的值n = 8
。与第二种情况一样,它仍然将所有零都视为有效值。
考虑另一种情况。
>>> n = '0008'
>>> print int(n)
>>> 8
现在在第三种情况下它仍然认为它是一个有效的数值,为什么不在这里引发异常?
答案 0 :(得分:10)
以0开头且不包含小数点的数字被解释为八进制(使用数字0-7)。 08不是有效的八进制数。根据PEP索引,“使用前导零指定八进制数的能力将从Python 3.0中的语言(以及2.6的Python 3.0预览模式)中删除,并且每当前导时都会引发一个SyntaxError” 0“紧接着是另一个数字”,可以在http://www.python.org/dev/peps/pep-3127/
找到答案 1 :(得分:4)
在大多数语言中,0
前缀表示八进制(基数为8)。
在python 2.7中我得到:
>>> n = 010
>>> n
8
我想你的问题在别的地方。 (如果这是一个版本问题,我想他们认为几乎没有人想要在基数8中对变量进行硬编码,所以他们把它变成了错误。)
- 编辑:
实际上,八进制文字格式已经改变(在3.0中):
http://docs.python.org/release/3.0.1/whatsnew/3.0.html#new-syntax
现在是:
>>> n = 0o10
>>> n
8
(适用于2.6 +)
答案 2 :(得分:3)
其他人已经回答了关于错误发生原因的问题;在Python中有一个数字文字的约定,因此以0
开头的文字被认为是八进制。如果在这样的文字中放置大于7
的数字,则结果是错误。然后,使用Python 3,该约定被更改,并且在它们的开头具有0
的所有文字都会导致抛出错误。
第二个问题是为什么int
不会抛出该错误。 int
不会抛出该错误,因为它有自己的用于指定字符串基础的约定:可选的第二个参数,默认值为10.这允许int
接受更广泛的值不用担心含糊不清。考虑一下,例如:
>>> int('55', 16)
85
>>> int('0x55', 16)
85
这里指定了基数;没有歧义。在这种情况下,在开头拒绝使用传统0x
的字符串将是一个障碍。同样地,当基数明确地为10时,在开头拒绝带0
的字符串是不合理的。
一般来说,(对我来说)语言对文字的严格要求是合理的,但对类型转换更灵活。
答案 3 :(得分:0)
我对此没有任何问题:
#!/usr/bin/python
def test2():
n = 01
print n
test2()
但为此它输出64
(基数为8):
def test2():
n = 0100
print n
test2()
Python 2.6.6