【问题标题】:Difference between outputs of variable and print variable in pythonpython中变量和打印变量输出之间的区别
【发布时间】:2014-06-23 07:21:10
【问题描述】:

我正在按照“Learn Python the Hard Way”一书中的练习 40 进行操作。我刚刚注意到以下几点:

In [15]: stuff
Out[15]: 
{1: 'Wow',
 2: 'Neato',
 'age': 36,
 'city': 'San Francisco',
 'height': 74,
 'name': 'Zed'}

In [16]:  print stuff
{'city': 'San Francisco', 2: 'Neato', 'name': 'Zed', 1: 'Wow', 'age': 36, 'height': 74}

为什么两个输出中字典项的顺序有差异?

【问题讨论】:

标签: python python-2.7 dictionary printing


【解决方案1】:

字典中元素的顺序是不可靠的,除非你使用像OrderedDict 这样的东西。出于性能原因等原因,它们会四处移动。Python 不保证元素以任何特定顺序出现,因此您永远不应该依赖它。

这里涉及到不同的代码路径——__repr____str__——所以我猜其中一个在某种程度上以不同的方式看待字典。但简短的版本是,本质上,字典中元素的顺序是不可靠的,你应该这样对待它。

编辑:事实上,正如在这个答案下面的 cmets 中所讨论的那样,recent versions of Python effectively randomize the order 是在运行到运行的基础上进行的。该实现依赖于hash 函数的输出,出于安全原因,该函数为seeded with a random value

【讨论】:

  • 顺序是确定性的(每个实现)和明确定义的,只是不能保证。
  • @jonrsharpe 我已经编辑以反映这一点,我不知道实现提供了确定性的一些保证。如果您认为可以改进,请告诉我。
  • __repr__ 实际上并不是这里使用的。它将用于普通的 Python 交互式解释器,但 OP 似乎正在使用 IPython,它使用某种漂亮的打印系统(可能是 pprint.pprint,我不知道)。
  • @jonrsharpe:这不是确定性的。保证在对字典的修改之间不会发生变化,但允许是随机的。使用SipHash 或旧的哈希随机化,字典顺序实际上有一个随机分量。
  • @user2357112 Apparently 它使用_repr_pretty_,尽管我想说这可能超出了 OP 的问题范围。涉及两个不同的代码路径,这为从连续调用中获得两个不同的结果提供了很好的理由。我对字典的内部结构了解不多——在我的脑海里,我认为它们是完全随机的——所以我很高兴做出任何编辑来澄清这对 OP 来说是最好的。
猜你喜欢
  • 2016-03-22
  • 1970-01-01
  • 2013-12-27
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多