为什么set的ipython输出与集合的__repr__或__str__不同?

时间:2016-03-02 03:08:12

标签: python python-2.7 ipython

我在ipython中运行以下代码,并对代码的打印输出和ipython单元格输出感到惊讶:


React.DOM.render(<App/>, document.getElementById('app'))

上述程序的输出如下:

print set(["A", "B", "C"])
print set(["A", "C", "B"])
print list(set(["A", "C", "B"]))
print list(set(["A", "B", "C"]))
print [k for k in set(["A", "C", "B"])]
print [k for k in set(["A", "B", "C"])]
a = set(["A", "B", "C"])
print a
print a.__repr__()
print a.__str__()
print [(k, hash(k)) for k in a]
a

请注意,单元格输出为set(['A', 'C', 'B']) set(['A', 'C', 'B']) ['A', 'C', 'B'] ['A', 'C', 'B'] ['A', 'C', 'B'] ['A', 'C', 'B'] set(['A', 'C', 'B']) set(['A', 'C', 'B']) set(['A', 'C', 'B']) [('A', -269909568), ('C', -13908798), ('B', -141909181)] Out[34]: {'A', 'B', 'C'} ,而打印输出为{'A', 'B', 'C'}

我的Python详细信息如下:

set(['A', 'C', 'B'])

3 个答案:

答案 0 :(得分:2)

IPython使用不同的打印功能:

In [1]: from IPython.lib.pretty import pprint

In [2]: a = set(["A", "B", "C"])

In [3]: pprint(a)
{'A', 'B', 'C'}

In [4]: a
Out[4]: {'A', 'B', 'C'}

答案 1 :(得分:1)

IPython不时添加一些魔力,使事物更具可读性。

在这种情况下,它会显示一个set literal(python2.7中的new)

以下是实现这一目标的代码:

https://github.com/ipython/ipython/blob/f49962dc931870a1eba4b6467ce302c8ae095b3f/IPython/lib/pretty.py#L560

答案 2 :(得分:0)

这是因为set是无序序列。定义set时,不会对其进行排序。当您尝试打印它时,它需要提供某种方式来对其进行排序,但它与set的元素的顺序无关。此外,当您尝试从list创建set时,需要提供一些订单。它提出的顺序总是相同的,但它与元素的顺序完全无关。