Theo https://docs.python.org/3/reference/lexical_analysis.html#integer-literals :
Các ký tự số nguyên được mô tả bằng các định nghĩa từ vựng sau:
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"
Không có giới hạn cho độ dài của các ký tự nguyên ngoài những gì có thể được lưu trữ trong bộ nhớ khả dụng.
Lưu ý rằng không cho phép các số 0 ở đầu trong một số thập phân khác 0. Điều này là để phân biệt với các ký tự bát phân kiểu C, mà Python đã sử dụng trước phiên bản 3.0.
Như đã lưu ý ở đây, không cho phép các số 0 đứng đầu trong một số thập phân khác 0 . "0"+
là hợp pháp như một trường hợp rất đặc biệt, không có trong Python 2 :
integer ::= decimalinteger | octinteger | hexinteger | bininteger
decimalinteger ::= nonzerodigit digit* | "0"
octinteger ::= "0" ("o" | "O") octdigit+ | "0" octdigit+
SVN cam kết r55866 đã thực hiện PEP 3127 trong trình mã hóa, cấm các 0<octal>
số cũ . Tuy nhiên, thật kỳ lạ, nó cũng thêm ghi chú này:
/* in any case, allow '0' as a literal */
với nonzero
cờ đặc biệt chỉ ném a SyntaxError
nếu dãy chữ số sau chứa chữ số khác không.
Điều này thật kỳ lạ vì PEP 3127 không cho phép trường hợp này:
PEP này đề xuất rằng khả năng chỉ định một số bát phân bằng cách sử dụng số 0 đứng đầu sẽ bị xóa khỏi ngôn ngữ trong Python 3.0 (và chế độ xem trước Python 3.0 là 2.6) và rằng Lỗi cú pháp sẽ được nâng lên bất cứ khi nào số "0" đứng đầu là ngay sau đó là một chữ số khác .
(nhấn mạnh của tôi)
Vì vậy, thực tế là cho phép nhiều số không về mặt kỹ thuật là vi phạm PEP và về cơ bản đã được Georg Brandl thực hiện như một trường hợp đặc biệt. Anh ấy đã thực hiện thay đổi tài liệu tương ứng để lưu ý rằng đó "0"+
là một trường hợp hợp lệ cho decimalinteger
(trước đó đã được đề cập trong octinteger
).
Chúng ta có thể sẽ không bao giờ biết chính xác lý do tại sao Georg chọn làm cho "0"+
hợp lệ - nó có thể mãi mãi vẫn là một trường hợp góc kỳ lạ trong Python.
CẬP NHẬT [28 tháng 7 năm 2015]: Câu hỏi này đã dẫn đến một chuỗi thảo luận sôi nổi về những ý tưởng về trăn mà Georg đã nói về :
Steven D'Aprano đã viết:
Tại sao nó được định nghĩa theo cách đó? [...] Tại sao chúng ta viết 0000 để nhận số 0?
Tôi có thể nói với bạn, nhưng sau đó tôi phải giết bạn.
Georg
Sau đó, luồng đã tạo ra báo cáo lỗi này nhằm mục đích loại bỏ trường hợp đặc biệt này. Đây, Georg nói :
Tôi không nhớ lý do cho sự thay đổi có chủ ý này (như đã thấy từ sự thay đổi tài liệu).
Tôi không thể đưa ra lý do chính đáng cho sự thay đổi này bây giờ [...]
và do đó chúng tôi có nó: lý do chính xác đằng sau sự mâu thuẫn này đã bị mất theo thời gian.
Cuối cùng, hãy lưu ý rằng báo cáo lỗi đã bị từ chối: các số không đứng đầu sẽ tiếp tục chỉ được chấp nhận trên các số nguyên 0 đối với phần còn lại của Python 3.x.