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

tem*_*ame 16 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
Run Code Online (Sandbox Code Playgroud)

同样,还有这些:

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
Run Code Online (Sandbox Code Playgroud)

等等,适用于所有标准关系代数运算.

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

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

Mar*_*ers 30

他们是非常不同的.一组更改设置到位,而其他离开原设定独自一人,并返回一个副本代替.

>>> s = {1, 2, 3}
>>> news = s | {4}
>>> s
set([1, 2, 3])
>>> news
set([1, 2, 3, 4])
Run Code Online (Sandbox Code Playgroud)

注意如何s保持不变.

>>> s.update({4})
>>> s
set([1, 2, 3, 4])
Run Code Online (Sandbox Code Playgroud)

现在我改变了s自己.还要注意,.update()似乎没有返回任何东西; 它没有返回s调用者,Python解释器没有回显值.

在原地更改对象的方法永远不会在Python中返回原始对象.它们的返回值总是None相反(永远不会回显).

  • 哈,14个月后,它的工作原理如此明显,以至于我不得不问我。不过谢谢...。这是一个过程。 (3认同)
  • @YiboYang:我进行了'timeit`试验; 差别不大; `s1 | = s2`比较慢(大约1-2%).考虑到扩充的`| =`赋值确实分配回`s1`,即使该对象首次就地更新(如果目标名称首先是一个类属性,或者是一个不可变对象的元素,这可能会产生影响) ). (3认同)