在Python 2.7中,repr
的a float
返回最接近的十进制数字,最长为17位;这足够精确以唯一地标识每个可能的IEEE浮点值。str
的float
工作类似,不同之处在于它限制了结果12位; 在大多数情况下,这是一个更合理的结果,它使您免受二进制和十进制表示形式之间的细微差别。
Python 2演示:http://ideone.com/OKJtxv
print str(1.4*1.5)
2.1
print repr(1.4*1.5)
2.0999999999999996
在Python 3.2中,它出现str
并repr
返回相同的内容。
Python 3演示:http://ideone.com/oAKRsb
print(str(1.4*1.5))
2.0999999999999996
print(repr(1.4*1.5))
2.0999999999999996
是否有描述变更的PEP或负责人的其他声明?
不,没有PEP。错误跟踪器中有一个问题,Python开发人员邮件列表中有相关的讨论。虽然我负责提出和实施更改,但我不能断言这是我的主意:它是在EuroPython 2010上与Guido进行对话时产生的。
更多详细信息:正如注释中已经提到的那样,Python 3.1引入了一种用于repr
float 字符串的新算法(后来回移植到Python 2系列,因此它也出现在Python 2.7中)。这种新算法的结果是,在提示符下键入的“短”十进制数字具有相应的短表示形式。这消除之间的差额现有的原因之一str
,并repr
,并有可能使用相同的算法都str
和repr
。因此对于Python 3.2,下面的讨论与上面链接在一起,str
并且repr
变得相同。至于原因:它使语言更小,更整洁,并且在输出字符串时消除了任意选择的12位数字。(选择的17位数字用于repr
顺便说一句,在2.7之前的Python版本中,并不是很随意:两个不同的IEEE 754 binary64浮点数在转换为带有17个有效数字的十进制时将具有不同的表示形式,而17是具有此属性的最小整数。)
除了简单之外,还有一些不太明显的好处。过去让用户感到困惑的repr
vs str
区分的一个方面是,事实是repr
自动在容器中使用它。因此,例如在Python 2.7中:
>>> x = 1.4 * 1.5
>>> print x
2.1
>>> print [x]
[2.0999999999999996]
我敢肯定至少有一个StackOverflow问题在某处询问此现象:这是一个这样的问题,另一个是最近的问题。通过Python 3.2中引入的简化,我们得到的是:
>>> x = 1.4 * 1.5
>>> print(x)
2.0999999999999996
>>> print([x])
[2.0999999999999996]
至少更加一致。
如果您确实希望能够隐藏不精确的地方,那么正确的做法将保持不变:使用字符串格式来精确控制输出格式。
>>> print("{:.12g}".format(x))
2.1
我希望这可以解释该更改背后的一些原因。我不会争辩说这是普遍有益的:正如您所指出的那样,旧str
有隐藏隐藏错误的便利副作用。但是我认为(当然,我有偏见),它确实有助于消除该语言带来的一些惊喜。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句