【问题标题】:Creating a set & removing an element in the same line yields different result than creating a set & removing element in different line in Python. Why?在同一行中创建集合并删除元素会产生与在 Python 中的不同行中创建集合并删除元素不同的结果。为什么?
【发布时间】:2020-06-06 20:55:04
【问题描述】:

我在 Python 中观察到一种我觉得奇怪的行为:

方法一

如果我这样做:

numberset=set([1,2,3])
numberset.remove(1)

现在numberset{2, 3},正如预期的那样。

方法二

但是,如果我这样做:

numberset=set([1,2,3]).remove(1)

numberset 现在是NoneType,即甚至不是setnumberset 不只是 set([1,2,3]) 的名称,那么为什么第二种方法导致的 numberset 与第一种不同?

【问题讨论】:

  • 因为set.remove 只返回None。它是一种就地方法,直接更改set,而不是返回一个新的。
  • 请澄清您的困惑。在第二种情况下,numbersetset([1,2,3]).remove(1) 的名称,而不是 set([1, 2, 3])。另请注意,没有必要将 set 与列表文字一起使用 - 使用像 {1, 2, 3} 这样的集合文字。

标签: python python-3.x methods set


【解决方案1】:

那是因为 return type of .remove is None: 它没有返回任何东西。它只会引发一个KeyError,即该值不在集合中。

如果您这样做,您的第一个代码将等于第二个代码:

numberset = set([1,2,3])
numberset = numberset.remove(1)

这也会导致numberset 成为None

如果您想将该代码放在一行中,您可以从集合中减去元素:

numberset = set([1, 2, 3]) - set([1])

使用集合减法,您还可以处理删除不在集合中的项目:

set([1, 2, 3]).remove(4)   # raises KeyError
set([1, 2, 3]) - set([4])  # return a set with elements: 1, 2, 3

正如 cmets 中所指出的,您可以/应该使用集合文字:{1, 2, 3}。这相当于set([1, 2, 3])。同理,你可以这样写:

numberset = {1, 2, 3} - {1}

PEP20 - The Zen of Python 引用结束:“简单胜于复杂。”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多