【问题标题】:Why does [] and bool return []? [duplicate]为什么 [] 和 bool 返回 []? [复制]
【发布时间】:2019-03-07 09:49:17
【问题描述】:

我试图在这样的函数中返回一个布尔值:

return mylist and any(condition(x) for x in mylist)

如果列表为空或其中任何元素满足条件,则行为应该是返回True。我将第一个操作数用作短路,因为如果列表为空,any 将返回True,这不是我想要的。

我希望[] and boolval 返回False,因为列表为空,但令我惊讶的是,无论boolvalTrue 还是False,它都会返回[]。我希望第一个操作数被自动评估为布尔值,因为它涉及比较操作,而不是发生任何事情。

我并不是真的在问如何解决我的问题,这很容易通过显式类型转换完成:bool(mylist),而是问发生了什么以及为什么。

编辑:当我问“为什么”会发生这种情况时,我不仅在寻找“事实”,因为它们已经在链接的重复问题中进行了解释,而且还包括实施这种行为背后的原因。

【问题讨论】:

  • x and y 如果x 是假的,则给出x,否则给出y。这是and 在布尔值上工作方式的概括。
  • 如果你想在这种情况下输出布尔值,你应该通过return bool(mylist) and ... 强制执行它。
  • @alec_djinn OP 在问题中涵盖了这一点。
  • @khelwood 我的错,太快了。

标签: python python-2.7


【解决方案1】:

因为正如赫尔伍德所说:

如果x 是假的,x and y 给出x,否则给出y

这就是重点,(and 不是 or :-)),所以最好的是:

return all([my_list,any(condition(x) for x in my_list)])

【讨论】:

    【解决方案2】:

    andor 运算符返回True/False。它们返回最后评估的内容(在其他动态语言中也是如此,例如 javascript)。

    official documentation describes that

    • 对于and,第一个假值或最后一个操作数
    • 对于or,第一个真值或最后一个操作数

    这是设计使然,因此您可以创建像 return username or 'guest' 这样的表达式。所以,如果你想保证返回一个布尔值,你必须

    return bool(x or y)
    

    而不是

    return x or y
    

    【讨论】:

    • 我怎么不知道呢?我习惯了x or y,当x 是假的时,我一直用它来分配,但我也不知道and 有什么用。您能否链接到涉及此问题的文档,尤其是实现此行为的原因?
    • #@dabadaba:已编辑。然而,我所知道的任何语言参考中都没有提供设计选择的理由。这似乎类似于and 的“给我第一个非空列表”,或者or 的“设置默认值”。
    • 这是另一个更明确的文档。或者更确切地说,它提供了一个操作员表格,并简要说明了他们的结果。就在它详细解释一个对象如何被认为是真或假之前。 docs.python.org/3/library/…
    【解决方案3】:

    这与 python 如何评估表达式有关。

    空列表被python认为是假的,这意味着'and'之后的代码不会被执行,因为这不会改变结果。

    Python 不需要将空列表转换为 bool,因为它不与任何东西进行比较,只需将其作为空列表返回。

    这不会对您造成任何影响,如果您测试函数的返回值,它将以与函数返回 False 相同的方式进行评估。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-27
      • 2012-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-14
      相关资源
      最近更新 更多