刚开始使用 Python,所以这可能是我的错误,但是......
我正在尝试 Python。我喜欢把它用作计算器,我正在慢慢学习一些教程。
我今天遇到了奇怪的事情。想查一下2013*2013,结果写错了,写了2013*013,得到了这个:
>>> 2013*013
22143
我用计算器查了一下,22143是错误的答案!2013 * 13 应该是 26169。
为什么 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 语言的人来说,整数的默认八进制表示会默默地混淆。无意中创建具有错误值的整数对象是非常容易的,因为对于 Python 语言本身,'013' 意味着'十进制 11',而不是'十进制 13',这不是大多数人会赋予这个字面量的含义.
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
并且需要0o
或0O
代替:
>>> 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”,整数将被解释为十六进制整数。完整的语法规范在这里,但如果你不熟悉形式语法,理解起来有点棘手:http: //docs.python.org/2/reference/lexical_analysis.html#integers
该表本质上说,如果您想要一个长值(即超过正常 int 容量的值),请写下数字后跟字母“L”或“l”;如果您希望您的数字以十进制解释,请正常写入数字(不带前导 0);如果您希望它以八进制解释,请在其前面加上“0”、“0o”或“0O”;如果你想要它是十六进制的,在它前面加上“0x”;如果你想要它是二进制的,在它前面加上“0b”或“0B”。