Per https://docs.python.org/3/reference/lexical_analysis.html#integer-literals :
Literal bilangan bulat dijelaskan oleh definisi leksikal berikut:
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"
Tidak ada batasan untuk panjang literal integer selain dari apa yang dapat disimpan dalam memori yang tersedia.
Perhatikan bahwa nol di depan dalam angka desimal bukan nol tidak diperbolehkan. Ini untuk disambiguasi dengan literal oktal gaya-C, yang digunakan Python sebelum versi 3.0.
Seperti disebutkan di sini, nol di depan dalam angka desimal bukan nol tidak diperbolehkan. "0"+
legal sebagai kasus yang sangat khusus, yang tidak ada di Python 2 :
integer ::= decimalinteger | octinteger | hexinteger | bininteger
decimalinteger ::= nonzerodigit digit* | "0"
octinteger ::= "0" ("o" | "O") octdigit+ | "0" octdigit+
SVN commit r55866 mengimplementasikan PEP 3127 di tokenizer, yang melarang 0<octal>
nomor lama . Namun, anehnya, itu juga menambahkan catatan ini:
/* in any case, allow '0' as a literal */
dengan nonzero
bendera khusus yang hanya melempar SyntaxError
jika urutan digit berikut berisi digit bukan nol.
Ini aneh karena PEP 3127 tidak mengizinkan kasus ini:
PEP ini mengusulkan bahwa kemampuan untuk menentukan bilangan oktal dengan menggunakan nol di depan akan dihapus dari bahasa di Python 3.0 (dan mode pratinjau Python 3.0 2.6), dan bahwa SyntaxError akan dimunculkan setiap kali awalan "0" adalah segera diikuti dengan digit lain .
(penekanan saya)
Jadi, fakta bahwa beberapa angka nol diperbolehkan secara teknis melanggar PEP, dan pada dasarnya diterapkan sebagai kasus khusus oleh Georg Brandl. Dia membuat perubahan dokumentasi terkait untuk mencatat bahwa "0"+
itu adalah kasus yang valid decimalinteger
(sebelumnya yang telah dibahas di bawah octinteger
).
Kita mungkin tidak akan pernah tahu persis mengapa Georg memilih untuk membuat "0"+
valid - itu mungkin selamanya tetap menjadi kasus sudut aneh di Python.
PEMBARUAN [28 Jul 2015]: Pertanyaan ini mengarah ke utas diskusi yang hidup tentang ide-python di mana Georg menimpali :
Steven D'Aprano menulis:
Mengapa didefinisikan seperti itu? [...] Mengapa kita menulis 0000 untuk mendapatkan nol?
Aku bisa memberitahumu, tapi kemudian aku harus membunuhmu.
Georg
Kemudian, utas memunculkan laporan bug ini yang bertujuan untuk menyingkirkan kasus khusus ini. Di sini, Georg berkata :
Saya tidak ingat alasan perubahan yang disengaja ini (seperti yang terlihat dari perubahan dokumen).
Saya tidak dapat menemukan alasan yang tepat untuk perubahan ini sekarang [...]
dan demikianlah kita memilikinya: alasan yang tepat di balik ketidakkonsistenan ini hilang seiring waktu.
Akhirnya, perhatikan bahwa laporan bug ditolak: nol di depan akan terus diterima hanya pada bilangan bulat nol untuk sisa Python 3.x.