集合中的union()和union_update()之间的区别是什么?

时间:2012-12-16 21:27:48

标签: python set set-operations

Python集具有以下方法:

s.union(t)  s | t   new set with elements from both s and t

s.update(t) s |= t  return set s with elements added from t

同样,还有这些:

s.intersection_update(t)    s &= t  return set s keeping only elements also found in t

s.intersection(t)   s & t   new set with elements common to s and t

依此类推,适用于所有标准关系代数运算。

所以......问题是,这里究竟有什么区别?我看到它说update()版本返回s而不是新集,但如果我写x = s.update(t),这是否意味着id(x) == id(s)?他们现在引用同一个对象吗?

我的意思是,我真的不明白为什么要实现这两套方法。它似乎没有添加任何重要的功能。

3 个答案:

答案 0 :(得分:28)

他们非常不同。一组更改了到位,而另一组则单独保留原始组,并返回副本

>>> s = {1, 2, 3}
>>> news = s | {4}
>>> s
set([1, 2, 3])
>>> news
set([1, 2, 3, 4])

请注意s如何保持不变。

>>> s.update({4})
>>> s
set([1, 2, 3, 4])

现在我已经改变了s。另请注意.update()似乎没有返回任何内容;它没有向调用者返回s,并且Python解释器没有回显值。

在原地更改对象的方法永远不会在Python中返回原始对象。它们的返回值始终为None(永远不会回显)。

答案 1 :(得分:2)

_update方法就地修改集合并返回None。没有update的方法返回一个新对象。您几乎肯定不想x = s.update(t),因为这会将x设置为无。

>>> x = set([1, 2])
>>> x.intersection(set([2, 3]))
set([2])
>>> x
set([1, 2])
>>> x.intersection_update(set([2, 3]))
>>> x
set([2])
>>> x = x.intersection_update(set([2, 3]))
>>> print x
None

_update方法添加的功能是修改现有集合的功能。如果在多个对象之间共享一个集合,则可能需要修改现有集合,以便共享它的其他对象将看到更改。如果您只是创建一个新集,其他对象将不会知道它。

答案 2 :(得分:1)

看起来文档没有以最清晰的方式说明,但set.update根本没有返回(这相当于返回None ),set.intersection_update也没有。与list.appendlist.extenddict.update一样,他们会修改容器。

In [1]: set('abba')
Out[1]: set(['a', 'b'])

In [2]: set('abba').update(set('c'))

In [3]: 

编辑:实际上,the docs并未说出您在问题中显示的内容。他们说:

  

更新集合,添加其他所有元素。

  

更新集合,仅保留在其中和其他所有元素中找到的元素。