<p><strong><a href="https://docs.python.org/3/library/stdtypes.html#set.add" rel="noreferrer">^{<cd1>}</a></strong></p>
<p><code>set.add</code>向集合中添加单个元素。所以</p>
<pre><code>>>> a = set()
>>> a.add(1)
>>> a
set([1])
</code></pre>
<p>有效,但它不能与iterable一起工作,除非它是散列的。这就是<code>a.add([1, 2])</code>失败的原因。</p>
<pre><code>>>> a.add([1, 2])
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: unhashable type: 'list'
</code></pre>
<p>这里,<code>[1, 2]</code>被视为添加到集合的元素,正如错误消息所说,<a href="https://stackoverflow.com/q/23268899/1903116">a list cannot be hashed</a>但是集合的所有元素都应该是散列的。引用<a href="https://docs.python.org/3/library/stdtypes.html#set" rel="noreferrer">documentation</a></p>
<blockquote>
<p>Return a new <code>set</code> or <code>frozenset</code> object whose elements are taken from iterable. The elements of a set must be <a href="https://docs.python.org/3/glossary.html#term-hashable" rel="noreferrer">hashable</a>.</p>
</blockquote>
<p><strong><a href="https://docs.python.org/3/library/stdtypes.html#set.update" rel="noreferrer">^{<cd5>}</a></strong></p>
<p>在<a href="https://docs.python.org/3/library/stdtypes.html#set.update" rel="noreferrer">^{<cd5>}</a>的情况下,您可以将多个iterable传递给它,它将迭代所有iterable并将单个元素包含在集合中。<em>记住:</em>它只能接受iterables。这就是为什么当您试图用<code>1</code>更新它时会出现错误的原因</p>
<pre><code>>>> a.update(1)
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: 'int' object is not iterable
</code></pre>
<p>但是,由于列表<code>[1]</code>是迭代的,并且列表的元素被添加到集合中,所以下面的方法可以工作。</p>
<pre><code>>>> a.update([1])
>>> a
set([1])
</code></pre>
<p><code>set.update</code>基本上等同于就地集合联合操作。考虑以下情况</p>
<pre><code>>>> set([1, 2]) | set([3, 4]) | set([1, 3])
set([1, 2, 3, 4])
>>> set([1, 2]) | set(range(3, 5)) | set(i for i in range(1, 5) if i % 2 == 1)
set([1, 2, 3, 4])
</code></pre>
<p>在这里,我们显式地将所有的iterable转换为set,然后找到并。有多个中间集和联合。在这种情况下,<code>set.update</code>是一个很好的帮助函数。既然它接受任何iterable,您可以简单地</p>
<pre><code>>>> a.update([1, 2], range(3, 5), (i for i in range(1, 5) if i % 2 == 1))
>>> a
set([1, 2, 3, 4])
</code></pre>