不,没有打气.bug追踪器中有issue个,Python开发者邮件列表中有associated discussion个.虽然我负责提出并实施这一改变,但我不能说这是我的 idea :它是在2010年欧罗皮顿与Guido的对话中产生的.
更多细节:如 comments 中所述,Python3.1为浮点字符串repr
引入了一种新算法(后来被后传到Python2系列,因此它也出现在Python2.7中).这种新算法的结果是,在提示符处输入的"短"十进制数具有相应的短表示形式.这消除了str
和repr
之间存在差异的现有原因之一,并使str
和repr
都可以使用相同的算法.因此,对于Python3.2,在上面的讨论之后,str
和repr
是相同的.至于原因:它使语言变得更小、更简洁,并且在输出字符串时删除了12位数字的任意 Select .(顺便说一句,在2.7之前的Python版本中, Select 用于repr
的17位远不是任意的:两个不同的IEEE 754 binary64浮点在转换为具有17个有效位的十进制时将具有不同的表示,17是具有此属性的最小整数.)
除了简单,还有一些不太明显的好处.过go ,repr
和str
的区别让用户感到困惑的一个方面是,repr
会自动在容器中使用.例如在Python 2.7中:
>>> x = 1.4 * 1.5
>>> print x
2.1
>>> print [x]
[2.0999999999999996]
我敢肯定,关于这种现象,至少有一个StackOverflow问题在问:here is one such个,还有another个最近的问题.通过Python 3.2中引入的简化,我们得到了以下结果:
>>> x = 1.4 * 1.5
>>> print(x)
2.0999999999999996
>>> print([x])
[2.0999999999999996]
这至少更加一致.
如果您确实希望能够隐藏不精确信息,正确的方法仍然是:使用字符串格式精确控制输出格式.
>>> print("{:.12g}".format(x))
2.1
我希望这能解释改变背后的一些原因.我不会说这是普遍有益的:正如你所指出的,旧的str
有隐藏不精确的方便的副作用.但在我看来(当然,我有偏见),它确实有助于消除语言中的一些惊喜.