错误的math与Python?

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

我正在尝试Python。 我喜欢用它作为计算器,而且我正在通过一些教程慢慢地工作。

我今天遇到了一些奇怪的事情。 我想找出2013 * 2013年,但是我写错了东西,写了2013 * 013,得到这个:

>>> 2013*013 22143 

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

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

由于八进制算术,013实际上是整数11。

 >>> 013 11 

在前导零处, 013被解释为基数为8的数字和1 * 8 1 + 3 * 8 0 = 11。

注意:这个行为在python 3中被改变了 。 这是来自PEP 3127的特别适当的引用

对于不熟悉C语言的人来说,默认的整数八进制expression式会让人感到困惑。 因为'013'意思是'十进制十一',而不是'十进制十三',所以不经意地用错误的值创build一个整数对象,这对于Python语言本身来说并不意味着大多数人会分配给这个文本。

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

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

这是非常常见的(当然,在我所熟悉的大多数语言中),八进制整数文字以0开始,而hex整数文字开始于0x 。 由于您经历的困惑,Python 3引发了一个SyntaxError:

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

并且需要0o0o来代替:

 >>> 2013*0o13 22143 >>> 2013*0O13 22143 

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

 Python 2.7.3 >>> 010 8 

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

这大部分只是扩展了@ Wim的答案,但是Python指出了使用某些前缀的整数文字的基础。 没有前缀,整数被解释为基于10。 使用“0x”时,该整数将被解释为hex整数。 完整的语法规范就在这里,尽pipe理解你是否对正式语法不熟悉是有点棘手的: http : //docs.python.org/2/reference/lexical_analysis.html#integers

该表基本上说,如果你想要一个长的值(即超过一个正常的int容量),写下数字后面加上字母“L”或“l”; 如果你想让你的号码被解释为十进制,请正常写入号码(没有前导0); 如果你想以八进制解释,用“0”,“0o”或“0O”作为前缀。 如果你想在hex中,用“0x”作为前缀; 如果你想在二进制文件中,用“0b”或“0B”作为前缀。