union()和union_update()在集合中的区别,以及其他区别?

2024-06-16 10:31:13 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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


Tags: and方法fromidaddednewreturnwith
3条回答

看起来文档并没有以最清晰的方式声明它,但是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不要说你在问题中显示的内容。他们说:

Update the set, adding elements from all others.

以及

Update the set, keeping only elements found in it and all others.

_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方法添加的功能是修改现有集合的能力。如果在多个对象之间共享一个集,则可能需要修改现有集,以便共享该集的其他对象可以看到更改。如果你只是创建一个新的集合,其他对象就不会知道它。

它们是非常不同的。一个集合将集合更改为原来的,而另一个将原始集合单独保留,并返回一个copy

>>> 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而不是(永远不会回显)。

相关问题 更多 >