为什么000在Python 3中评估为0?

Jea*_*bre 15 python int literals

由于八进制前缀现在0o在Python 3中,因此再写不合法0777.好的.

那么为什么编写00哪个评估正确0而其他数字触发语法错误是合法的呢?

>>> 01
  ...
  File "<interactive input>", line 1
    01
     ^
SyntaxError: invalid token
>>> 
>>> 00
0
Run Code Online (Sandbox Code Playgroud)

Wil*_*sem 17

如果看一下Lexical Analysis(Integer Literal Section)页面:

integer      ::=  decinteger | bininteger | octinteger | hexinteger
decinteger   ::=  nonzerodigit (["_"] digit)* | "0"+(["_"] "0")*
...
Run Code Online (Sandbox Code Playgroud)

这意味着decinteger要么以非零数字开头(后跟所有可能的数字和可选的下划线),要么是一系列带有可选下划线的零(映射到零).

该文件还指出:

请注意,在前导零的非零十进制数不会允许的.

所以这意味着他们为零做了一个例外(在所有文档中都可以找到):你可以将零写为零序列.我的猜测当然是他们必须包括"0"(你怎么把零指定为decinteger?),那么为什么不允许在这种情况下更多的零,无论数字系统如何,000都保持为零.他们可能不希望允许01decinteger,以防止不小心运行代码,从而获得完全不同的结果.

最后请注意,下划线只是该规范的一部分,因为:在3.5规范中,它们在语法中没有提到.

,文档指定零后跟其他数字(也是其他零)octinteger:

integer        ::=  decimalinteger | octinteger | hexinteger | bininteger
decimalinteger ::=  nonzerodigit digit* | "0"
octinteger     ::=  "0" ("o" | "O") octdigit+ | "0" octdigit+
Run Code Online (Sandbox Code Playgroud)

  • @Jean-FrançoisFabre:我的猜测是,无论使用什么基数,零序列始终为零。 (2认同)
  • @AngelSalazar:这是*Backus-Naur形式*的变体:https://en.wikipedia.org/wiki/Backus_Naur_form (2认同)