69

Pythonに前に0が付いた小さな整数を入力すると、奇妙な結果が得られます。どうしてこれなの?

>>> 011
9
>>> 0100
64
>>> 027
23

Python2.7.3を使用しています。私はこれをPython3.0でテストしましたが、明らかにこれはエラーです。つまり、バージョン固有のものです。

それらは明らかにまだ整数です:

>>> type(027)
<type 'int'>
4

9 に答える 9

78

これらは、基数8で表される数値(8進数)です。いくつかの例:

Python 2(古い形式)

:これらのフォームはPython2.xでのみ機能します。

0111⋅8¹+1⋅8⁰=9に等しい

01001⋅8²+0⋅8¹+0⋅8⁰=64に等しい、

0272⋅8¹+7⋅8⁰=16+ 7=23に等しくなります。

Python 3(新しい形式)

Python 3では、8進定数を示すため0oだけにではなく、またはなどを使用する必要があります。Python2.xバージョン> = 2.6は、新しい形式と古い形式の両方をサポートします。00o110o27

0o111⋅8¹+1⋅8⁰=9に等しい

0o1001⋅8²+0⋅8¹+0⋅8⁰=64に等しい、

0o272⋅8¹+7⋅8⁰=16+ 7=23に等しくなります。

于 2012-07-23T20:40:01.187 に答える
46

Python 2(およびその他のいくつかのプログラミング言語)では、これらは8進数を表します。

Python 3では、011機能しなくなり、0o11代わりに使用します。

編集への応答:そしてそれらは通常の整数です。それらは異なる方法で指定されています。そして、それらはPythonによって内部整数表現に自動的に変換されます(実際には2進数であるため、両方とも9内部011的にに変換され0b1001ます)。

于 2012-07-23T20:41:33.370 に答える
10

8進数の記数法での数値。その他のプレフィックスは0x、16進数および0b2進数用です。

于 2012-07-23T20:40:51.363 に答える
10

Pythonバージョン2と3はどちらも、先頭に「0o」と「0O」(大文字のo)で書かれた8進数を理解するため、Python2.xを使用する場合もifを使用する習慣があります。

文字列の数値には先行ゼロのみを使用してください。

int()を使用して、他の任意の基本システムから整数を変換できます。

>>> int(0o20)

16

出力を先行ゼロで表示する場合は、次の回答に従って定義します。 先行ゼロで数値を表示する

郵便番号を使用する予定がある場合は、あらゆる方法で郵便番号を文字列として扱うのが最善です。

于 2016-08-02T04:38:17.317 に答える
6

これらは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)に適用されます。

于 2012-07-23T20:40:29.617 に答える
4

それはとても簡単です。それらは8進数です。

http://en.wikipedia.org/wiki/Octal

また、で始まる番号もあります0x。それらは16進数です:

>>> 0x51
81
于 2012-07-23T20:40:08.580 に答える
2

これらは明らかに8進数(基数8)であり、0はPython2が使用していた古いプレフィックスです。

0o11Python 3では、代わりに:を記述する必要があります。

それらはまだ整数ですが、それらを使用して演算を実行すると、通常の10進数の形式で結果が得られます。

于 2012-07-25T16:10:18.007 に答える
0

試してみました。私は少し学びました。Javaから、私はこれを落とし穴として知っています。先行ゼロは8進数を導入します。私には、応答しなかった同僚がいます。Javaでの経験が何年も続いた後、それを知りません。

今、私はPythonでの動作が何であるか興味深いものでした。Python2からPython3への変更に感謝します。Java(「簡単に」に焦点を当てた若い言語)がCからその愚かなソリューションを引き継ぐことができる理由を私は理解していません。

プレフィックスとしての先行ゼロが誤って入力される可能性があります(悪い解決策)。16進数の0xが誤って入力されることはありません(適切な解決策)。しかし、0とoは似ているので、Pythonの0o23は完璧なソリューションではないと思います。私の意見では、 0c23(o c tal)の方が良い解決策になるでしょう。

于 2018-08-04T08:49:32.927 に答える
0

数値リテラルの最新のPython仕様は、PEP-3127「整数リテラルのサポートと構文」にあります。

011の構文は、Python3.0で削除されました。0o11の構文はPython2.6で追加されており、Python3.0以降でサポートされているのはこれだけです。Python 2には、先行ゼロを含む数値リテラルを禁止または少なくとも警告するインポートはありません__future__。そのため、開発者は011の意味と、回避する必要がある(そして実際に回避できる)ことを知っている必要があります。

于 2018-09-12T21:13:53.517 に答える