Python数学错误?


78

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

我正在尝试Python。我喜欢将其用作计算器,并且正在逐步研究一些教程。

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

>>> 2013*013
22143

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

为什么Python给我一个错误的答案?我的旧卡西欧计算器无法执行此操作...



6
+1实际上会引起注意。我知道这是一个八进制数字,但是如果我不知道,我现在会认为2013 * 13是22143。您如何发现它的答案是错误的?
2013年

11
我在高中的时候做了一段时间的心理数学,我认为22143比应该的要小。因此,我检查了可信赖的计算器。
James Elegan

2
+1表示信任您的好点头。
肖恩·艾瑞德

13
@ 11684如果两个数字的最后一位数字均为3,则乘积的最后一位数字必须为9。小学数学...
Aleksandar

Answers:


137

由于采用八进制算法,因此013实际上是整数11。

>>> 013
11

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

注意:此行为已在python 3更改。这是PEP 3127中特别合适的报价

默认的八进制整数表示形式会给不熟悉C语言的人带来混乱。意外地创建一个带有错误值的整数对象非常容易,因为对于Python语言本身,“ 013”的意思是“十进制11”,而不是“十进制13”,这不是大多数人会赋予此文字的意思。 。


14
@JamesElegan:也许这就是Python 3将语法定为0123非法且始终需要的原因之一0o123
Tim Pietzcker 2013年

3
是的,0后跟0-8的前缀是八进制的。0x前缀后跟0-9a-f是十六进制。
Frambot

97
为什么程序员总是混淆万圣节和圣诞节?因为DEC25 == OCT31!Nyuk nyuk nyuk。
Frambot

16
@JoeFrambach,0后跟0- 7的前缀是八进制的:)
Mark Tolonen

5
仁慈的独裁者没有在第一轮中从Lisp中正确复制。这些内容必须清晰明了:#xFF,#o777,#b1011。
卡兹(Kaz)2013年

36

01311由于前导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 

谢谢你的回答!我认为这个八进制的东西有点令人困惑,但至少现在我知道了:)
James Elegan

3
不客气 正如我和@wim的回答所指出的那样,Python社区正在尽其所能,以最大程度地减少Python 3对八进制文字的新手困惑。但是,要意识到这是一件非常好的事-您可以确定自己会遇到再次使用0前缀的八进制文字,无论是使用Python 2.X还是其他某种语言。
Darshan Rivka Whittle,2013年

2
PEP 3127在这方面读起来有些可笑...例如:“一个新的Python用户可能(目前)由于延迟发现他的数字不能正常工作而感到迷惑,我们可以通过立即向他解释Python来解决它不喜欢前导零(希望有一条合理的消息!),或者我们可以将这种教学经验委派给Internet Explorer浏览器中的JavaScript解释器,然后让他尝试在那里调试问题。”
2013年


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”。


当我输入很大的数字(例如99999999999999999999999999999,但不喜欢3333333333)时,Python似乎会自动添加L。有什么时候需要自己添加吗?
James Elegan

@JamesElegan仅当您使用的是疯狂版本的Python时。在Python 3中,L和int和long类型之间的所有其他区别也完全消失了。
lvc

Python 2.7并没有老旧,我接受吗?因此,我不需要添加L。(我一直在听有关Python 3的好消息,也许我应该安装并使用它?)
James Elegan

@JamesElegan我找不到任何确切的信息,有关哪个以前的版本要求其后缀的字面量大于一个字面量的后缀int(并且我可能实际上错了一个字头)-我自己的记忆可以追溯到相当远的距离确保2.4不需要它。但是,是的,如果您不依赖于尚未移植的任何库,那么通常值得推荐使用Python 3。
lvc

Python 2.7是Python 2的最新版本。实际上,这个周末发布了2.7.4。Python 3与Python 2有本质的不同,但是最终大多数Python代码将在不久的将来被编写为Python 3代码,或者至少这是目标。所以,如果你是刚刚起步,你可以选择其中之一来学习,我建议无论是3位或2和3
凯尔东街
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.