了解Python命理学

时间:2012-02-01 03:17:44

标签: python

我们不能声明一个以0开头的整数。

>>> n = 08
SyntaxError: invalid token

但我们确实声明了一个包含全零的变量。

>>> n = 00000
>>> print n
>>> 0

所以问题在于第一种情况,为什么python不通过忽略左侧的零而不是引发异常来考虑变量的值n = 8。与第二种情况一样,它仍然将所有零都视为有效值。

考虑另一种情况。

>>> n = '0008'
>>> print int(n)
>>> 8

现在在第三种情况下它仍然认为它是一个有效的数值,为什么不在这里引发异常?

4 个答案:

答案 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