为什么Python在前面有0时会改变整数的值?

时间:2012-11-02 12:25:06

标签: python integer python-2.x

我实现了一个函数,将整数转换为字符串intToStr()(下面的代码)。

为了进行测试,我传入了一些值并观察到意外的输出:

print intToStr( 1223) # prints 1223 as expected
print intToStr(01223) # prints  659, surprisingly 

现在,我尝试调试它,我传入的整数确实是659

为什么会发生这种情况?如何让python忽略整数字面的前导零?


这是我的功能代码:

def intToStr(i):
    digits = '0123456789'
    if i == 0:
        return 0
    result = ""
    while i > 0:
        result = digits[i%10] + result
        i /= 10
    return result

4 个答案:

答案 0 :(得分:9)

以0开头的整数文字被解释为octal number, base 8

>>> 01223
659

这在Python 3中已经改变,其中前导0的整数被认为是错误:

>>> 01223
  File "<stdin>", line 1
    01223
        ^
SyntaxError: invalid token
>>> 0o1223
659

你永远不应该指定带前导零的整数文字;如果你想指定一个八进制数,请使用0o启动它,否则删除那些零。

答案 1 :(得分:4)

正如其他人所说的那样是因为八进制数。但我强烈建议您将功能更改为:

>>> from functools import partial
>>> force_decimal = partial(int, base=10)
>>> force_decimal("01")
1
>>> force_decimal("0102301")
102301

通过这种方式,您将明确强制转换为基数10.并且int不会为您推断它。

答案 2 :(得分:1)

0开头的数字被解释为octal numbers。 如果以0x开头,则为十进制十六进制。

答案 3 :(得分:0)

前导零使Python将您的数字解释为八进制(base-8)。

要删除零(假设num是一个字符串),请执行:

num.lstrip("0")