为什么在python中set(None)无效

时间:2011-10-10 22:31:29

标签: python types set

>>> set(None)
*** TypeError: 'NoneType' object is not iterable

是一个问题但不是这个问题:

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

为什么?

2 个答案:

答案 0 :(得分:13)

正如错误消息所示,set()期望可迭代。

set([None])

注意:listtuple,...

也是如此

答案 1 :(得分:3)

因为set初始化器接受一个必须可迭代的对象,但add()只要其hashable就可以使用任何元素。由于NoneType不可迭代,因此会引发异常。

  

上课 set([iterable])
  返回一个新的set或frozenset对象,其元素取自iterable。   集合的元素必须是   哈希的。要表示集合集,内部集必须是冻结集   对象。如果未指定iterable,则返回一个新的空集。

     

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

     

iterable
一个能够一次返回其成员的对象。迭代的例子包括所有序列类型(例如列表,   str和tuple)以及一些非序列类型,如dict和file   您使用__iter__()__getitem__()定义的任何类的对象   方法。 Iterables可用于for循环和许多其他地方   需要序列的地方(zip(),map(),...)。当一个可迭代的   object作为参数传递给内置函数iter(),它   返回对象的迭代器。这个迭代器适用于一次通过   超过这组价值观。使用iterables时,通常不会   必须调用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__',