2016-03-02 2 views
1

Я бегу следующий код в IPython и удивляюсь печатающих выходов и выходов IPython ячейки кода:Почему вывод ipython отличается от __repr__ или __str__ набора?

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'} в то время как печатная продукция является set(['A', 'C', 'B'])

Моей Python деталь следующим образом:

import sys 
print sys.version 
2.7.11 |Anaconda 2.3.0 (64-bit)| (default, Jan 29 2016, 14:26:21) [MSC v.1500 64 bit (AMD64)] 

ответ

0

Это потому, что set является неупорядоченной последовательностью. Когда вы определяете set, он не упорядочен. Когда вы пытаетесь распечатать его, ему нужно каким-то образом заказать его, но он не связан с каким порядком были указаны элементы set. Кроме того, когда вы пытаетесь создать list от set, ему необходимо придумать какой-то заказ. Какой порядок он придет, всегда будет одним и тем же, но он совершенно не связан с тем, в каком порядке указаны элементы.

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'} 
Смежные вопросы