Почему 00 является допустимым целым числом в Python?

В документации Python:

integer      ::=  decinteger | bininteger | octinteger | hexinteger
decinteger   ::=  nonzerodigit (["_"] digit)* | "0"+ (["_"] "0")*
bininteger   ::=  "0" ("b" | "B") (["_"] bindigit)+
octinteger   ::=  "0" ("o" | "O") (["_"] octdigit)+
hexinteger   ::=  "0" ("x" | "X") (["_"] hexdigit)+
nonzerodigit ::=  "1"..."9"
digit        ::=  "0"..."9"
bindigit     ::=  "0" | "1"
octdigit     ::=  "0"..."7"
hexdigit     ::=  digit | "a"..."f" | "A"..."F"

Я не могу понять, почему 00 является допустимым целым числом с такими определениями? Однако кажется, что nonzerodigit должна быть ведущей цифрой:

>>> isinstance(00, int)
True

А может быть тот же вопрос: почему 0 действителен?

чуть ниже таблицы, которую вы скопировали, написано: Note that leading zeros in a non-zero decimal number are not allowed, This is for disambiguation with C-style octal literals, which Python used before version 3.0 но в вашем случае перед ведущим нулем стоит нулевое десятичное число, что разрешено.

Elerium115 14.03.2024 13:23

Также второй раздел после оператора OR (| "0"+ (["_"] "0")*) будет охватывать шаблон 00.

user459872 14.03.2024 13:25

@abdul-niyas-p-m Разве нам не следует читать эту строку как nonzerodigit, за которой следует ...?

david 14.03.2024 13:30

Если бы это было так, то было бы написано nonzerodigit ((["_"] digit)* | "0"+ (["_"] "0")*)(ИЛИ кейс был бы завернут в паранетис)

user459872 14.03.2024 13:41

Чередование имеет самый низкий приоритет в EBNF. Итак, nonzerodigit есть только в первом варианте.

Barmar 14.03.2024 16:56

@barmar Тем не менее, страница обозначений включает пример с тем же синтаксисом: onething (another)* и указывает: onething, за которым следует последовательность из нуля или более... Я интерпретирую это как onething, который является обязательным.

david 14.03.2024 17:03

Это. Но | делит его на две альтернативы. nonzerodigit является обязательным только в первом варианте.

Barmar 14.03.2024 17:31

И "0"+ является обязательным во втором варианте.

Barmar 14.03.2024 17:32

Итак, decinteger имеет два синтаксиса: один для чисел, начинающихся с 0, другой для чисел, не начинающихся с 0. А последний позволяет быть только остальным цифрам 0

Barmar 14.03.2024 17:33

Хорошо, теперь я понял! Спасибо.

david 14.03.2024 17:34
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
10
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чего вам не хватает, так это того, что обозначение | для альтернатив имеет самый низкий приоритет. Итак, decinteger разделен на два отдельных производства:

  • nonzerodigit (["_"] digit)*
  • "0"+ (["_"] "0")*

Первый предназначен для чисел, не начинающихся с 0, он допускает любые цифры в остальной части числа. Второй предназначен для чисел, начинающихся с 0, он допускает только числа, состоящие из 0. Оба позволяют вставлять необязательные символы _ между цифрами для облегчения чтения.

Таким образом, 0, 00, 000 и т. д. во втором произведении разрешены как допустимые десятичные целые числа. И все их значения равны нулю.

В некоторых документах EBNF альтернативы вынесены в отдельные строки, чтобы было легче увидеть разбивку. В документации Python выбран этот более компактный формат.

Другие вопросы по теме

Похожие вопросы