为什么在Python中set(None)无效
>>> 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])
注意:list
、tuple
等也是一样的要求。