27

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)?它们现在是否引用同一个对象?

为什么要实现这两组方法?它似乎没有添加任何重要的功能。

4

3 回答 3

46

它们非常不同。一组更改就地的集合,而另一组则单独保留原始集合,并返回一个副本

>>> 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相反(从不回显)。

于 2012-12-16T21:29:37.107 回答
2

这些_update方法就地修改集合并返回无。没有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是修改现有集合的能力。如果您在多个对象之间共享一个集合,您可能需要修改现有集合,以便共享它的其他对象可以看到更改。如果您只是创建一个新集合,其他对象将不会知道它。

于 2012-12-16T21:30:52.213 回答
1

看起来文档没有以最清晰的方式说明它,但set.update根本没有返回任何东西(相当于返回None),也没有set.intersection_update。像list.appendor list.extendor dict.update,他们修改容器就地。

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

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

In [3]: 

编辑:实际上,文档并没有说明您在问题中显示的内容。他们说:

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

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

于 2012-12-16T21:33:02.840 回答