代码之家  ›  专栏  ›  技术社区  ›  dabadaba

为什么[]和布尔返回[][[副本]

  •  4
  • dabadaba  · 技术社区  · 6 年前

    我试图在如下函数中返回布尔值:

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

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

    我希望 [] and boolval False 因为清单是空的,但令我惊讶的是它回来了 [] boolval 是的 . 我希望第一个操作数被自动计算为布尔值,因为它涉及比较操作,而不是正在发生的任何事情。

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

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

    3 回复  |  直到 6 年前
        1
  •  6
  •   blue_note    6 年前

    这个 and or 不要 True/False . 他们回来了 最后评估的东西 (其他动态语言也是如此,比如javascript)。

    official documentation describes that

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

    这是经过设计的,所以你可以创建如下表达式 return username or 'guest' . 所以,如果你想 保证

    return bool(x or y)
    

    而不是

    return x or y
    
        2
  •  1
  •   U13-Forward    6 年前

    因为正如科尔伍德所说:

    x and y 给予 x 如果 是假的,否则会给你 y .

    and 不是 or :-)),所以最好还是:

    return all([my_list,any(condition(x) for x in my_list)])
    
        3
  •  0
  •   tagette    6 年前

    python将空列表视为false,这意味着不会执行'and'后面的代码,因为这不会更改结果。

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

    这不会对您造成任何改变,如果您测试函数的返回值,它的计算方式将与函数返回False的方式相同。