集合中的 union() 和 update() 之间的区别,以及其他?

新手上路,请多包涵

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

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

原文由 temporary_user_name 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 619
2 个回答

他们 非常 不同。一个集合 就地 改变集合,而另一个保留原始集合,并返回一个 _副本_。

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

原文由 Martijn Pieters 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

原文由 BrenBarn 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题