【问题标题】:How do boolean operations work with parentheses in python 2.7?布尔运算如何在 python 2.7 中使用括号?
【发布时间】:2014-04-28 20:17:56
【问题描述】:

在玩的时候发现了这个小怪。

>>> 'Hello' == ('Hello' or 'World')
True
>>> 'Hello' == ('World' or 'Hello')
False
>>> 'Hello' == ('Hello' and 'World')
False
>>> 'Hello' == ('World' and 'Hello')
True

这个逻辑有什么我没有理解的技巧吗?为什么字符串的顺序是这些查询的决定因素?我根本不应该使用括号吗?为什么更改为“和”会翻转输出?

谢谢你。

【问题讨论】:

  • 只需在交互式提示中输入'Hello' or 'World',看看会发生什么。
  • >>> 'Hello' 返回'Hello'。我直接从 UNIX shell 中复制了它。
  • 只需在交互式提示中输入'Hello' or 'World',看看会发生什么。
  • 为什么所有的反对票?诚然,这可能在其他地方得到了回答,但对于不熟悉该语言的人来说,这仍然是一种令人惊讶的行为,而且问题本身的措辞也足够好。
  • 好的,所以我重读了你的评论,捂着脸,然后试了一下。那么or 返回第一个值,and 返回最后一个值?而orand 更“强”?因为我然后尝试了这个:'Hello' or 'World' and '!' 它返回了'Hello'

标签: python python-2.7 logic boolean-expression


【解决方案1】:

在 Python 中,所有对象都可能被认为是“真实的”或“虚假的”。 Python 在评估布尔逻辑时使用这个事实来创建一个偷偷摸摸的快捷方式。如果它遇到一个允许逻辑“短路”的值,例如or 开头的True,或and 开头的False,它只是返回最终值。这是有效的,因为该值 本身 被适当地评估为真或假,因此无论使用它的布尔上下文如何继续按预期运行。事实上,这样的操作总是只返回他们遇到的第一个值,使他们能够完全评估表达式(即使它是最后一个值)。

# "short-circuit" behavior
>>> 2 or 0
2
>>> 0 and 2
0

# "normal" (fully-evaluated) behavior
>>> 'cat' and 'dog'
'dog'
>>> 0 or 2
2

【讨论】:

    【解决方案2】:
    • x or y 如果第一个操作数为真则返回,否则返回 第二个操作数。
    • x and y 返回第一个操作数,如果它 falsey,否则返回第二个操作数。

    对于看起来你想要完成的事情,你可能更喜欢这个:

    'Hello' in ['Hello', 'World']
    

    【讨论】:

    • 谢谢,这就是我正在做的事情(使用列表),但我很好奇,所以我四处寻找。我想 SO 认为这是一个非常愚蠢的问题,在 -2 处。
    • 不傻,但已经有很多很多问题涉及同一个问题,所以在提问之前确实表明缺乏研究。
    • @eli_dink 我没有否决您的问题,但是我在 python 标签上看到的 许多 问题可以通过在交互式提示中输入一些内容来回答。这一点,以及内置的帮助使 python 很容易学习和调试。
    猜你喜欢
    • 2017-12-05
    • 2011-10-05
    • 1970-01-01
    • 2022-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多