Jam*_*gan 77 python math python-2.7
刚开始使用Python,所以这可能是我的错误,但......
我正在尝试使用Python.我喜欢用它作为计算器,我正在慢慢地完成一些教程.
我今天遇到了一些奇怪的事情.我想找出2013*2013,但我写了错误的东西,写了2013*013,并得到了这个:
>>> 2013*013
22143
Run Code Online (Sandbox Code Playgroud)
我用我的计算器检查了,22143是错误的答案!2013*13应该是26169.
为什么Python给我一个错误的答案?我的旧卡西欧计算器不这样做......
wim*_*wim 137
由于八进制算术,013实际上是整数11.
>>> 013
11
Run Code Online (Sandbox Code Playgroud)
前导零013被解释为基数为8且1*8 1 + 3*8 0 = 11.
注意:此行为在python 3中已更改.以下是PEP 3127特别合适的引用
整数的默认八进制表示对于不熟悉类C语言的人来说是无声的混淆.很容易无意中创建一个具有错误值的整数对象,因为'013'对于Python语言本身而言意味着'十进制11'而不是'十进制13',这不是大多数人将分配给这个文字的含义.
Dar*_*tle 36
01311由于前导0,因此是八进制整数文字(相当于十进制整数字面值).
>>> 2013*013
22143
>>> 2013*11
22143
>>> 2013*13
26169
Run Code Online (Sandbox Code Playgroud)
以八进制整数文字开头0并以十六进制整数文字开头是非常常见的(当然在大多数我熟悉的语言中)0x.由于您遇到的确切困惑,Python 3引发了一个SyntaxError:
>>> 2013*013
File "<stdin>", line 1
2013*013
^
SyntaxError: invalid token
Run Code Online (Sandbox Code Playgroud)
并要求无论是0o或0O不是:
>>> 2013*0o13
22143
>>> 2013*0O13
22143
Run Code Online (Sandbox Code Playgroud)
Python的八进制文字的"前导零"语法是一个常见的问题:
Python 2.7.3
>>> 010
8
Run Code Online (Sandbox Code Playgroud)
在Python 3.x http://docs.python.org/3.0/whatsnew/3.0.html#integers中更改了语法
这主要是扩展@Wim的答案,但Python表示使用某些前缀的整数文字的基础.如果没有前缀,整数将被解释为基数为10.使用"0x",整数将被解释为十六进制int.完整的语法规范在这里,虽然如果你不熟悉正式的语法有点麻烦:http://docs.python.org/2/reference/lexical_analysis.html#integers
该表基本上表示如果你想要一个长值(即一个超过正常int的容量的值),写下数字后跟字母"L"或"l"; 如果您希望以十进制数解释您的数字,请正常写入数字(不带前导0); 如果你想用八进制解释它,用"0","0o"或"0O"作为前缀; 如果你想要它的十六进制,前缀为"0x"; 如果你想要二进制文件,请在其前面添加"0b"或"0B".