Mengapa Python 3 mengizinkan "00" sebagai literal untuk 0 tetapi tidak mengizinkan "01" sebagai literal untuk 1? Apakah ada alasan yang bagus? Ketidakkonsistenan ini membuatku bingung. (Dan kita berbicara tentang Python 3, yang dengan sengaja merusak kompatibilitas ke belakang untuk mencapai tujuan seperti konsistensi.)
Sebagai contoh:
>>> from datetime import time
>>> time(16, 00)
datetime.time(16, 0)
>>> time(16, 01)
File "<stdin>", line 1
time(16, 01)
^
SyntaxError: invalid token
>>>
python
python-3.x
integer
literals
leading-zero
anjing laut
sumber
sumber
Jawaban:
Per https://docs.python.org/3/reference/lexical_analysis.html#integer-literals :
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 :SVN commit r55866 mengimplementasikan PEP 3127 di tokenizer, yang melarang
0<octal>
nomor lama . Namun, anehnya, itu juga menambahkan catatan ini:dengan
nonzero
bendera khusus yang hanya melemparSyntaxError
jika urutan digit berikut berisi digit bukan nol.Ini aneh karena PEP 3127 tidak mengizinkan kasus ini:
(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 validdecimalinteger
(sebelumnya yang telah dibahas di bawahoctinteger
).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 :
Kemudian, utas memunculkan laporan bug ini yang bertujuan untuk menyingkirkan kasus khusus ini. Di sini, Georg berkata :
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.
sumber
octinteger
case Python 2 kedua"0" octdigit*
.0
adalah literal oktal di C / C ++.001
itu ilegal, sedangkan interpretasi Anda akan membuatnya legal (karena arti "segera" harus cukup jelas).Ini kasus khusus (
"0"+
)2.4.4. Literal bilangan bulat
Jika Anda melihat tata bahasanya, sangat mudah untuk melihat bahwa
0
perlu kasus khusus. Saya tidak yakin mengapa '+
' dianggap perlu di sana. Saatnya menggali milis dev ...Menarik untuk dicatat bahwa di Python2, lebih dari satu
0
diurai sebagaioctinteger
(hasil akhirnya masih0
)sumber
"0"+
dan tidak"0"
?Python2 menggunakan nol di depan untuk menentukan bilangan oktal:
Untuk menghindari hal ini (? Menyesatkan) perilaku, Python3 membutuhkan awalan eksplisit
0b
,0o
,0x
:sumber
00
diperbolehkan? (Dan000
,,0000
dll.)01
juga1
terlepas dari dasar.can't be ambiguous
itu bukan argumen karena01
juga tidak bisa ambigu. IMO,00
kasusnya hanyalah kasus khusus karena memang0
seharusnya tidak demikian.