당 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 진수의 선행 0은 허용되지 않습니다. 이것은 파이썬이 3.0 이전에 사용했던 C 스타일 8 진 리터럴과의 명확성을위한 것입니다.
여기에서 언급했듯이 0이 아닌 10 진수의 선행 0은 허용되지 않습니다. 파이썬 2에는 없었던"0"+
매우 특별한 경우로 합법적입니다 .
integer ::= decimalinteger | octinteger | hexinteger | bininteger
decimalinteger ::= nonzerodigit digit* | "0"
octinteger ::= "0" ("o" | "O") octdigit+ | "0" octdigit+
SVN commit r55866 은 tokenizer에서 PEP 3127을 구현하여 이전 0<octal>
번호 를 금지합니다 . 그러나 흥미롭게도 다음과 같은 메모도 추가합니다.
/* in any case, allow '0' as a literal */
다음 숫자 시퀀스에 0이 아닌 숫자가 포함 된 경우 nonzero
에만 a를 던지는 특수 플래그가 SyntaxError
있습니다.
PEP 3127 이이 경우를 허용하지 않기 때문에 이것은 이상합니다 .
이 PEP는 선행 0을 사용하여 8 진수를 지정하는 기능이 Python 3.0 (및 Python 3.0 미리보기 모드 2.6)의 언어에서 제거되고 선행 "0"이 올 때마다 SyntaxError가 발생한다고 제안합니다. 바로 뒤에 다른 숫자가옵니다 .
(강조 내)
따라서 여러 개의 0이 허용된다는 사실은 기술적 으로 PEP를 위반하는 것이며 기본적으로 Georg Brandl에 의해 특수 사례로 구현되었습니다. 그는 해당 문서를 변경하여 (이전에는에서 다루었던) "0"+
유효한 사례 임을 기록했습니다 .decimalinteger
octinteger
우리는 Georg가 왜 유효화를 선택 했는지 정확히 알지 못할 것입니다 "0"+
. 파이썬에서 영원히 이상한 경우로 남아있을 수 있습니다.
업데이트 [2015 년 7 월 28 일] :이 질문은 Georg가 다음 과 같이 했던 파이썬 아이디어에 대한 활발한 토론 스레드로 이어졌습니다 .
Steven D' Aprano는 다음과 같이 썼습니다.
왜 그렇게 정의 되었습니까? [...] 왜 우리는 0을 얻기 위해 0000을 쓰겠습니까?
말해 줄 수는 있지만 그럼 죽여야 해요
게오르그
나중에 스레드 는이 특별한 경우를 제거하기 위해이 버그 보고서를 생성 했습니다 . 여기 Georg는 다음과 같이 말합니다 .
이 의도적 인 변경의 이유를 기억하지 못합니다 (문서 변경에서 볼 수 있음).
나는 지금이 변화에 대한 좋은 이유를 생각 해낼 수 없다 ...]
따라서 우리는 그것을 가지고 있습니다.이 불일치의 정확한 이유는 시간이 지남에 따라 사라집니다.
마지막으로, 버그 보고서가 거부되었습니다. 나머지 Python 3.x에서는 0 정수에서만 선행 0이 계속 허용됩니다.