Python 030 == 24是真的,这是怎么回事?

Hen*_*nyH 1 python

我遇到了以下问题:

正如您所料:

>>> [01,02,03]
[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

将superflous添加0到整数的前面会导致整数N的数学等价0N,即N.

但是,当我这样做时:

>>> [030, 031, 031, 031, 030, 031, 031, 032, 031, 032]
[24, 25, 25, 25, 24, 25, 25, 26, 25, 26]
Run Code Online (Sandbox Code Playgroud)

事实证明这一观点完全不正确.我试图通过尝试检查是否030为int 来弄清楚为什么会这样:

>>> type(030)
<type 'int'>
Run Code Online (Sandbox Code Playgroud)

然后我想也许,030正在评估24,然后它反而得到type(24).所以我想看看发生了什么dis可能会有所帮助:

>>> dis.dis('n=030')
          0 JUMP_FORWARD    12349 (to 12352)
          3 DELETE_SLICE+1 
          4 <48>           
>>> dis.dis('n=30')
          0 JUMP_FORWARD    13117 (to 13120)
          3 <48>    
Run Code Online (Sandbox Code Playgroud)

这无助于澄清为什么会出现这种情况.那么,这种行为背后的共鸣是什么?

根据标题:

>>> 030 == 24
True
Run Code Online (Sandbox Code Playgroud)

Joh*_*ooy 10

主要0方式是八进制或基数8.这是Python2定义的行为,但是由于它导致的混乱,你现在需要0o30用Python3 编写,就像你写0x18的十六进制数一样

0o30语法也能在Python2.7,所以它的使用这个,如果你希望写八文字是个好主意

这也是为什么08,并09会导致错误- 8和9不是有效的八进制数字

  • @HennyH因此3.x中的行为改变.正如Python所设计的那样,存在一些错误.幸运的是,他们也正在修复. (2认同)