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

5
>>> set(None)
*** TypeError: 'NoneType' object is not iterable
这是一个问题,但下面的代码不是:
>>> a=set()
>>> a.add(None)
为什么呢?

我倾向于同意你的观点。应该将None视为空元素,而不是简单地不添加它而不抛出错误。 - Toaster
2个回答

15

正如错误信息所告诉您的那样,set()需要一个可迭代对象。

set([None])
注意:对于listtuple等也是同样适用。

整天问些愚蠢的问题,我的烟在哪里。 - Lelouch Lamperouge
1
在我看来,这不是一个愚蠢的问题。无论如何,我还是学到了东西!在查阅这个问题之前,我不知道NoneType是可哈希的,所以感谢@EknathIyer :)。 - chown

4
因为set初始化器需要一个可以迭代的对象,但add()方法只要求元素是可哈希的即可。由于NoneType不可迭代,所以会引发异常。 set([iterable]):返回一个新的set或frozenset对象,其中的元素来自于可迭代对象。set的元素必须是可哈希的。为了表示集合中的集合,内部集合必须是frozenset对象。如果没有指定可迭代对象,则返回一个新的空set。 add(elem):将元素elem添加到set中。 可迭代对象:能够一次返回其成员的对象。可迭代对象包括所有序列类型(例如list、str和tuple)以及一些非序列类型(如dict和file),以及您定义的具有__iter__()或__getitem__()方法的任何类的对象。可迭代对象可用于for循环和许多其他需要序列的地方(如zip(),map()等)。当可迭代对象作为参数传递给内置函数iter()时,它将返回该对象的迭代器。这个迭代器对值的集合进行一次遍历。使用可迭代对象时,通常不需要调用iter()或处理迭代器对象。for语句会自动为您完成这个操作,在循环期间创建一个临时无名变量来保存迭代器。另请参阅iterator、sequence和generator。
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__',

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接