2011-10-10 64 views
3
>>> set(None) 
*** TypeError: 'NoneType' object is not iterable

是一個問題,但不是這個:爲什麼設置(無)在python無效

>>> a=set() 
>>> a.add(None)

爲什麼?

+0

我傾向於同意你的看法。沒有人應該被視爲空的元素,只是不添加沒有拋出一個錯誤。 – Colin

回答

11

由於錯誤消息告訴你,set()預計可迭代。

set([None]) 

注:同樣適用於listtuple,......只要

+0

我一整天都在問愚蠢的問題,我的香菸在哪裏 –

+1

不是一個愚蠢的問題伊莫。無論如何,我學到了東西!直到我看到這個問題,才知道NoneType是可散列的,所以謝謝@EknathIyer :)。 – chown

3

由於集合初始化需要一個對象,它必須是可迭代的,但增加()將採取任何元素作爲其可哈希。由於NoneType不可迭代,因此會引發異常。

set([iterable])
返回一組新的或frozenset對象,其元素從迭代採取。 一組元素必須是 可哈希。爲了表示集合集,內部集合必須被凍結集合 對象。如果未指定iterable,則返回一個新的空集。

add(elem)將元素elem添加到集合中。

iterable
一個對象能夠一次返回一個成員。迭代示例包括所有序列類型(例如列表, str和元組)以及一些非序列類型(如字典和文件)以及使用__iter__()__getitem__() 方法定義的任何類的對象。 Iterables可以用在for循環中以及需要序列的許多其他地方 (zip(),map(),...)。當可迭代的 對象作爲參數傳遞給內建函數iter()時,它將返回該對象的迭代器。這個迭代器對於該組值是一次傳遞 。在使用迭代器時,通常不需要調用iter()或者自己處理迭代器對象。 for語句會自動爲您執行此操作,創建一個臨時 未命名的變量以在循環的持續時間內保存迭代器。 另請參閱迭代器,序列和生成器。

In [18]: hash(None) 
Out[18]: 39746304 

In [19]: iter(None) 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 

/home/jon/<ipython console> in <module>()  
TypeError: 'NoneType' object is not iterable 

In [21]: dir(None) 
Out[21]: 
['__class__', 
'__delattr__', 
'__doc__', 
'__format__', 
'__getattribute__', 
'__hash__', 
'__init__', 
'__new__', 
'__reduce__', 
... 
'__subclasshook__'] 

In [22]: dir([]) 
Out[22]: 
[... 
'__hash__', 
'__getitem__', 
... 
'__iter__',