Python 030==24是真的,这怎么正确?

Python 030==24是真的,这怎么正确?,python,Python,我遇到了以下问题: 正如你所料: >>> [01,02,03] [1, 2, 3] 在整数N的前面添加superflous0,将得到整数0N的数学等价物,即N 然而,当我这样做时: >>> [030, 031, 031, 031, 030, 031, 031, 032, 031, 032] [24, 25, 25, 25, 24, 25, 25, 26, 25, 26] 这一观点被证明是完全错误的。我试图通过检查030是否为int来找出原因: >&g

我遇到了以下问题:

正如你所料:

>>> [01,02,03]
[1, 2, 3]
在整数
N
的前面添加superflous
0
,将得到整数
0N
的数学等价物,即
N

然而,当我这样做时:

>>> [030, 031, 031, 031, 030, 031, 031, 032, 031, 032]
[24, 25, 25, 25, 24, 25, 25, 26, 25, 26]
这一观点被证明是完全错误的。我试图通过检查
030
是否为int来找出原因:

>>> type(030)
<type 'int'>
这无助于澄清为什么会发生这种行为。那么,这种行为背后的原因是什么

根据标题:

>>> 030 == 24
True

前导的
0
表示八进制或base8。这是Python2的定义行为,但由于它造成的混乱,您现在需要在Python3中编写
0o30
,就像编写
0x18
十六进制数一样

0o30
语法也适用于Python2.7,因此,如果您确实希望编写八进制文字,那么最好使用它


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

前导的
0
表示八进制或基数8。这是Python2的定义行为,但由于它造成的混乱,您现在需要在Python3中编写
0o30
,就像编写
0x18
十六进制数一样

0o30
语法也适用于Python2.7,因此,如果您确实希望编写八进制文字,那么最好使用它


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

030
是八进制表示法,是3*8so24。

030
是八进制表示法,是3*8so24。

0
添加到python数字的前面会将其转换为八进制数。因此,十进制表示法中的
030
=3*8=24。

0
添加到python数字的前面,使其成为八进制数字。因此,十进制表示法中的
030
=3*8=24。

030
意味着30个八进制,所以是24。最新版本的Python不会让你像这样射中自己的腿。前导零不再意味着八进制文字。事实上,数字中的前导零是完全不允许的。@BrenBarn你是对的,这个问题本质上是一样的,我想我的措辞让相似性检查中没有出现这个结果。
030
意味着30个八进制,所以是24个。最新版本的Python不会让你像这样射中自己的腿。前导零不再意味着八进制文字。事实上,数字中的前导零是完全不允许的。@BrenBarn你是对的,这个问题本质上是一样的,我想我的措辞使相似性检查中没有出现这个结果。哦,这很有道理,仍然很混乱,尽管肯定不是我所期望的。@HennyH因此在3.x中改变了行为。尽管Python设计得很好,但也存在错误的情况。幸运的是,它们也被修复了。@HennyH,这不是Python独有的-很多语言都是这样解释领先的0哦,这很有意义,尽管肯定不是我所期望的,但仍然很混乱。@HennyH因此在3.x中改变了行为。尽管Python设计得很好,但也存在错误的情况。幸运的是,它们也被修复了。@HennyH,这不是Python独有的——许多语言都是这样解释领先的0的
>>> 030 == 24
True