パーhttps://docs.python.org/3/reference/lexical_analysis.html#integer-literals:
整数リテラルは、次の字句定義によって記述されます。
integer ::= decimalinteger | octinteger | hexinteger | bininteger
decimalinteger ::= nonzerodigit digit* | "0"+
nonzerodigit ::= "1"..."9"
digit ::= "0"..."9"
octinteger ::= "0" ("o" | "O") octdigit+
hexinteger ::= "0" ("x" | "X") hexdigit+
bininteger ::= "0" ("b" | "B") bindigit+
octdigit ::= "0"..."7"
hexdigit ::= digit | "a"..."f" | "A"..."F"
bindigit ::= "0" | "1"
使用可能なメモリに格納できるものを除いて、整数リテラルの長さに制限はありません。
0以外の10進数の先行ゼロは許可されないことに注意してください。これは、Pythonがバージョン3.0より前に使用していたCスタイルの8進数リテラルを明確にするためです。
ここで述べたように、0 以外の 10進数の先行ゼロは許可されていません。Python 2にはなかっ"0"+
た非常に特殊なケースとして合法です:
integer ::= decimalinteger | octinteger | hexinteger | bininteger
decimalinteger ::= nonzerodigit digit* | "0"
octinteger ::= "0" ("o" | "O") octdigit+ | "0" octdigit+
SVNコミットr55866は、古い0<octal>
番号を禁止するトークナイザに PEP 3127を実装しました。ただし、奇妙なことに、次のメモも追加されます。
/* in any case, allow '0' as a literal */
次の一連の数字にゼロ以外の数字が含まれてnonzero
いるSyntaxError
場合にのみaをスローする特別なフラグを使用します。
PEP 3127はこのケースを許可しないため、これは奇妙です。
このPEPは、先行ゼロを使用して8進数を指定する機能がPython 3.0(およびPython 3.0プレビューモード2.6)の言語から削除され、先行 "0"が常にある場合はSyntaxErrorが発生することを提案しています。直後に別の数字が続く。
(強調鉱山)
したがって、複数のゼロが許可されるという事実は、技術的にはPEPに違反しており、基本的にGeorg Brandlによって特別なケースとして実装されました。彼は対応するドキュメントの変更を行い、それ"0"+
がdecimalinteger
(以前はでカバーされていた)の正当なケースであることを指摘しましたoctinteger
。
Georgが有効にすることを選択した理由を正確に知ることはおそらくないでしょう"0"+
。Pythonで奇妙なコーナーケースがいつまでも残る可能性があります。
更新 [2015年7月28日]:この質問はpython-ideasに関する活発なディスカッションスレッドにつながり、Georgは次のように発言しました。
Steven D'Apranoはこう書いている:
なぜそのように定義されたのですか?[...]ゼロを取得するために0000を書き込むのはなぜですか?
私はあなたに言うことができました、しかしそれから私はあなたを殺さなければなりませんでした。
ジョージ
後で、スレッドはこの特別なケースを取り除くことを目的としてこのバグレポートを生成しました。ここで、ジョージは言う:
(ドキュメントの変更からわかるように)この意図的な変更の理由を思い出しません。
私は今、この変更の正当な理由を思い付くことができません[...]
このように私たちはそれを持っています:この矛盾の背後にある正確な理由は時が経てば失われます。
最後に、バグレポートが拒否されたことに注意してください。先行するゼロは、残りのPython 3.xのゼロ整数でのみ引き続き受け入れられます。