78

刚开始使用 Python,所以这可能是我的错误,但是......

我正在尝试 Python。我喜欢把它用作计算器,我正在慢慢学习一些教程。

我今天遇到了奇怪的事情。想查一下2013*2013,结果写错了,写了2013*013,得到了这个:

>>> 2013*013
22143

我用计算器查了一下,22143是错误的答案!2013 * 13 应该是 26169。

为什么 Python 给我一个错误的答案?我的旧卡西欧计算器不这样做......

4

4 回答 4

137

因为八进制运算,013 实际上是整数 11。

>>> 013
11

带有前导零,013被解释为以 8 为底的数字和 1*8 1 + 3*8 0 = 11。

注意:此行为在 python 3 中已更改。这是来自PEP 3127的特别合适的引用

对于不熟悉类 C 语言的人来说,整数的默认八进制表示会默默地混淆。无意中创建具有错误值的整数对象是非常容易的,因为对于 Python 语言本身,'013' 意味着'十进制 11',而不是'十进制 13',这不是大多数人会赋予这个字面量的含义.

于 2013-04-09T05:47:41.670 回答
36

013是一个八进制整数文字(相当于十进制整数文字11),由于前导 0。

>>> 2013*013
22143
>>> 2013*11
22143
>>> 2013*13
26169

八进制整数文字以 . 开头0而十六进制整数文字以0x. 由于您遇到的确切困惑,Python 3 引发了 SyntaxError:

>>> 2013*013
  File "<stdin>", line 1
    2013*013
           ^
SyntaxError: invalid token

并且需要0o0O代替:

>>> 2013*0o13
22143
>>> 2013*0O13
22143 
于 2013-04-09T05:52:22.703 回答
7

Python 的八进制文字的“前导零”语法是一个常见的问题:

Python 2.7.3
>>> 010
8

Python 3.x 中的语法已更改http://docs.python.org/3.0/whatsnew/3.0.html#integers

于 2013-04-09T22:12:22.977 回答
5

这主要只是扩展了@Wim 的答案,但是 Python 使用某些前缀表示整数文字的基础。如果没有前缀,整数将被解释为以 10 为基数。使用“0x”,整数将被解释为十六进制整数。完整的语法规范在这里,但如果你不熟悉形式语法,理解起来有点棘手:http: //docs.python.org/2/reference/lexical_analysis.html#integers

该表本质上说,如果您想要一个长值(即超过正常 int 容量的值),请写下数字后跟字母“L”或“l”;如果您希望您的数字以十进制解释,请正常写入数字(不带前导 0);如果您希望它以八进制解释,请在其前面加上“0”、“0o”或“0O”;如果你想要它是十六进制的,在它前面加上“0x”;如果你想要它是二进制的,在它前面加上“0b”或“0B”。

于 2013-04-09T06:01:16.227 回答