为什么00在Python中是有效整数?

1 投票
1 回答
63 浏览
提问于 2025-04-14 16:06

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也是有效的?

相关问题:

1 个回答

2

你可能没注意到,|这个符号表示选择时,它的优先级是最低的。所以decinteger被分成了两个不同的部分:

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

第一个部分是针对那些不以0开头的数字,它允许后面的数字是任何数字。第二个部分是针对以0开头的数字,它只允许所有的数字都是0。这两种情况都允许在数字之间加上_,这样看起来更清晰。

所以像000000等都是有效的十进制整数,都是由第二个部分允许的。而它们的值都是零。

一些EBNF文档会把选择放在不同的行上,这样更容易看出结构。而Python的文档选择了这种更紧凑的格式。

撰写回答