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

5 投票
2 回答
9887 浏览
提问于 2025-04-17 04:03
>>> set(None)
*** TypeError: 'NoneType' object is not iterable

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

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

为什么?

2 个回答

4

因为集合的初始化需要一个可迭代的对象,而add()方法可以接受任何可哈希的元素。由于NoneType是不可迭代的,所以会引发一个异常。

set([iterable])
这个方法会返回一个新的集合或不可变集合(frozenset),它的元素来自于给定的可迭代对象。集合的元素必须是可哈希的。如果没有指定可迭代对象,就会返回一个新的空集合。

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

可迭代对象
这是一个可以一次返回一个成员的对象。可迭代对象的例子包括所有的序列类型(比如列表、字符串和元组),还有一些非序列类型,比如字典和文件,以及你自己定义的任何类,只要它们有__iter__()__getitem__()方法。可迭代对象可以在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__',
15

这个错误信息告诉你,set() 需要一个可以迭代的对象。

set([None])

注意:listtuple 等也是一样的要求。

撰写回答