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