理解Python命理学

理解Python命理学,python,Python,我们不能声明以0开头的整数 >>> n = 08 SyntaxError: invalid token 但我们确实声明了一个包含所有零的变量 >>> n = 00000 >>> print n >>> 0 问题是在第一个例子中,为什么Python忽略了左边的零点而不是引发异常,而不考虑变量对 n=8 < /代码>的值。与第二种情况一样,它仍然将所有零视为有效值 考虑另一个例子 >>> n = '0008

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

>>> n = 08
SyntaxError: invalid token
但我们确实声明了一个包含所有零的变量

>>> n = 00000
>>> print n
>>> 0
问题是在第一个例子中,为什么Python忽略了左边的零点而不是引发异常,而不考虑变量对<代码> n=8 < /代码>的值。与第二种情况一样,它仍然将所有零视为有效值

考虑另一个例子

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

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

我对此没有问题:

#!/usr/bin/python

def test2():
    n = 01
    print n

test2()
但为此,它输出
64
(基数8):


python2.6.6

在大多数语言中,
0
前缀表示八进制(以8为基数)

在python 2.7中,我得到:

>>> n = 010
>>> n
8
我想你的问题在别处。(不过,如果是版本问题,我想他们认为几乎没有人想硬编码基数为8的变量,所以他们把它当成了一个错误)

--编辑:

实际上,八进制文字格式已经改变(在3.0中):

现在是:

>>> n = 0o10
>>> n
8

(适用于2.6+)

以0开头且不包含小数点的数字被解释为八进制(使用数字0-7)。08不是有效的八进制数。根据PEP索引,“通过使用前导零指定八进制数的功能将从Python 3.0语言(以及Python 3.0预览模式2.6)中删除,并且每当前导“0”后面紧跟着另一个数字时,就会出现语法错误”可以在这里找到

关于为什么会发生错误的问题已经被其他人回答了;Python中的数字文本有一个约定,以
0
开头的文本被视为八进制。如果在这样的文字中输入大于
7
的数字,则结果是错误的。然后,在Python3中,该约定被更改,并且所有开头带有
0
的文本都会导致抛出错误

第二个问题是为什么
int
不会抛出该错误
int
不会抛出该错误,因为它有自己指定字符串基的约定:一个可选的第二个参数,默认值为10。这允许
int
接受更大范围的值,而不必担心歧义。考虑这一点,例如:

>>> int('55', 16)
85
>>> int('0x55', 16)
85
此处指定了底座;没有歧义。在这种情况下,在开始时拒绝使用常规
0x
的字符串将是一个障碍。同样,当基数明确为10时,在开始时拒绝使用
0
的字符串也是不合理的


一般来说,(对我来说)一种语言严格要求文本是有道理的,但在类型转换方面更灵活。

有趣的是,Python 2.7.1允许
n=01
,但Python 3.2抛出了一个
SyntaxError
。我在windows命令行上使用Python shell声明变量,它在那里引发了错误,将此代码保存在.py文件中不会产生异常。奇怪的是,我用shell的输出更新了我的问题。8不是八进制的有效数字,如果你改为n=010;印刷品。8将打印出来,因为八进制中的10是8。就是这样。Python认为它是八进制的。所以为什么int('0008')不会引发异常???@AamirAdnan好吧,您可能可以安全地假设,在尝试转换int时,大多数时候,您希望它们位于10进制。因此,默认行为就是这样做。大多数语言都有一种方法来解析字符串,就好像它在某个基中一样。但它可能只是默认为基数10。例如,考虑:
int('010',8)
。那么为什么int('0008')不会引发异常呢?原因与
int('010')
给出的
10
相同<代码>求值('08')将给您一个例外。它与数字系统有关。有二进制、十六进制、八进制等。看看数字表示法,当它解释数字的不同表示法时,最好是直观地看到它,因为它完全令人困惑和奇怪first@Aamir阿德南,我意识到你的问题还有第二部分——见上文。
>>> int('55', 16)
85
>>> int('0x55', 16)
85