为什么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也是有效的?
相关问题:
1 个回答
2
你可能没注意到,|这个符号表示选择时,它的优先级是最低的。所以decinteger被分成了两个不同的部分:
nonzerodigit (["_"] digit)*"0"+ (["_"] "0")*
第一个部分是针对那些不以0开头的数字,它允许后面的数字是任何数字。第二个部分是针对以0开头的数字,它只允许所有的数字都是0。这两种情况都允许在数字之间加上_,这样看起来更清晰。
所以像0、00、000等都是有效的十进制整数,都是由第二个部分允许的。而它们的值都是零。
一些EBNF文档会把选择放在不同的行上,这样更容易看出结构。而Python的文档选择了这种更紧凑的格式。