Pythonに前に0が付いた小さな整数を入力すると、奇妙な結果が得られます。どうしてこれなの?
>>> 011
9
>>> 0100
64
>>> 027
23
Python2.7.3を使用しています。私はこれをPython3.0でテストしましたが、明らかにこれはエラーです。つまり、バージョン固有のものです。
それらは明らかにまだ整数です:
>>> type(027)
<type 'int'>
Pythonに前に0が付いた小さな整数を入力すると、奇妙な結果が得られます。どうしてこれなの?
>>> 011
9
>>> 0100
64
>>> 027
23
Python2.7.3を使用しています。私はこれをPython3.0でテストしましたが、明らかにこれはエラーです。つまり、バージョン固有のものです。
それらは明らかにまだ整数です:
>>> type(027)
<type 'int'>
これらは、基数8で表される数値(8進数)です。いくつかの例:
注:これらのフォームはPython2.xでのみ機能します。
011
1⋅8¹+1⋅8⁰=9に等しい
0100
1⋅8²+0⋅8¹+0⋅8⁰=64に等しい、
027
2⋅8¹+7⋅8⁰=16+ 7=23に等しくなります。
Python 3では、8進定数を示すため0o
だけにではなく、またはなどを使用する必要があります。Python2.xバージョン> = 2.6は、新しい形式と古い形式の両方をサポートします。0
0o11
0o27
0o11
1⋅8¹+1⋅8⁰=9に等しい
0o100
1⋅8²+0⋅8¹+0⋅8⁰=64に等しい、
0o27
2⋅8¹+7⋅8⁰=16+ 7=23に等しくなります。
Python 2(およびその他のいくつかのプログラミング言語)では、これらは8進数を表します。
Python 3では、011
機能しなくなり、0o11
代わりに使用します。
編集への応答:そしてそれらは通常の整数です。それらは異なる方法で指定されています。そして、それらはPythonによって内部整数表現に自動的に変換されます(実際には2進数であるため、両方とも9
内部011
的にに変換され0b1001
ます)。
8進数の記数法での数値。その他のプレフィックスは0x
、16進数および0b
2進数用です。
Pythonバージョン2と3はどちらも、先頭に「0o」と「0O」(大文字のo)で書かれた8進数を理解するため、Python2.xを使用する場合もifを使用する習慣があります。
文字列の数値には先行ゼロのみを使用してください。
int()を使用して、他の任意の基本システムから整数を変換できます。
>>> int(0o20)
16
出力を先行ゼロで表示する場合は、次の回答に従って定義します。 先行ゼロで数値を表示する
郵便番号を使用する予定がある場合は、あらゆる方法で郵便番号を文字列として扱うのが最善です。
これらは8進数です(基数8、値0〜7)
oct()関数を使用して、10進数を8進数に変換できます。
In [125]: for i in range(10):
.....: print '{:5} {:5}'.format(i, oct(i))
.....:
0 0
1 01
2 02
3 03
4 04
5 05
6 06
7 07
8 010
9 011
適切な基数(この場合は8)のint()関数を使用して、8進数値を整数に変換します。
int(str(17), 8)
Out[129]: 15
同様のルール/関数のセットは、 hex()関数を使用して16進数(基数16)に適用されます。
これらは明らかに8進数(基数8)であり、0はPython2が使用していた古いプレフィックスです。
0o11
Python 3では、代わりに:を記述する必要があります。
それらはまだ整数ですが、それらを使用して演算を実行すると、通常の10進数の形式で結果が得られます。
試してみました。私は少し学びました。Javaから、私はこれを落とし穴として知っています。先行ゼロは8進数を導入します。私には、応答しなかった同僚がいます。Javaでの経験が何年も続いた後、それを知りません。
今、私はPythonでの動作が何であるか興味深いものでした。Python2からPython3への変更に感謝します。Java(「簡単に」に焦点を当てた若い言語)がCからその愚かなソリューションを引き継ぐことができる理由を私は理解していません。
プレフィックスとしての先行ゼロが誤って入力される可能性があります(悪い解決策)。16進数の0xが誤って入力されることはありません(適切な解決策)。しかし、0とoは似ているので、Pythonの0o23は完璧なソリューションではないと思います。私の意見では、 0c23(o c tal)の方が良い解決策になるでしょう。
数値リテラルの最新のPython仕様は、PEP-3127「整数リテラルのサポートと構文」にあります。
011の構文は、Python3.0で削除されました。0o11の構文はPython2.6で追加されており、Python3.0以降でサポートされているのはこれだけです。Python 2には、先行ゼロを含む数値リテラルを禁止または少なくとも警告するインポートはありません__future__
。そのため、開発者は011の意味と、回避する必要がある(そして実際に回避できる)ことを知っている必要があります。