3

整数を文字列としての表現に変換する関数を実装しました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

4 に答える 4

9

0 で始まる整数リテラルは、基数 8 の 8 進数として解釈されます。

>>> 01223
659

これは Python 3 で変更され、0 で始まる整数はエラーと見なされます。

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

先頭にゼロを付けた整数リテラルを指定しないでください。8 進数を指定する場合は、 を使用0oして開始し、そうでない場合はそれらのゼロを取り除きます。

于 2012-11-02T12:26:35.093 に答える
4

他の人が言ったように、それは8進数のためです。ただし、関数を次のように変更することを強くお勧めします。

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

このようにして、基数 10 への変換を明示的に強制します。int はそれを推測しません。

于 2012-11-02T12:33:57.663 に答える
1

a で始まる数値は8 進数0として解釈されます。で始まる場合は、16 進数です。0x

于 2012-11-02T12:26:57.910 に答える
0

先行ゼロにより、Pythonは数値を8進数(基数8)として解釈します。

ゼロを取り除くには(numが文字列であると仮定して)、次のようにします。

num.lstrip("0")
于 2012-11-02T12:31:15.197 に答える