理解Python集的行为

use*_*312 7 python set

内置类型的文档set说:

class set([iterable])
Run Code Online (Sandbox Code Playgroud)

返回一个新的set或frozenset对象,其元素取自iterable.集合的元素必须是可以清除的.

没关系,但为什么这样做:

>>> l = range(10)
>>> s = set(l)
>>> s
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
Run Code Online (Sandbox Code Playgroud)

而这不是:

 >>> s.add([10])

    Traceback (most recent call last):
      File "<pyshell#7>", line 1, in <module>
        s.add([10])
    TypeError: unhashable type: 'list'
Run Code Online (Sandbox Code Playgroud)

两者都是清单.在初始化过程中是否会发生一些魔法

phi*_*hag 14

初始化集时,您需要提供必须每个都可以清除的值列表.

s = set()
s.add([10])
Run Code Online (Sandbox Code Playgroud)

是相同的

s = set([[10]])
Run Code Online (Sandbox Code Playgroud)

抛出你现在看到的同样错误.


Gab*_*aru 5

In [13]: (2).__hash__
Out[13]: <method-wrapper '__hash__' of int object at 0x9f61d84>

In [14]: ([2]).__hash__ # nothing.
Run Code Online (Sandbox Code Playgroud)

问题是set需要其项是可哈希的,即实现__hash__魔术方法(据我所知,该方法用于在树中进行排序)。list没有实现一个魔术方法,因此它不能在一组加入。


nov*_*lis 5

在这一行:

s.add([10])
Run Code Online (Sandbox Code Playgroud)

您正在尝试向集合添加列表,而不是列表的元素.如果您想要添加列表的元素,请使用update方法.