【问题标题】:Why do I not get True when I type 2 or 3 at the Python console?为什么我在 Python 控制台输入 2 或 3 时没有得到 True?
【发布时间】:2018-10-02 20:21:26
【问题描述】:

在 Python 中,任何非零值都被评估为 True。因此,例如,下面的代码打印Yes

if 2 or 3:
    print('Yes')

但是,如果我在 Python 控制台输入 2 or 3,我会得到 2 而不是 True。为什么会有不同的行为?

【问题讨论】:

  • 或返回它遇到的第一个真值。特别是,它不会将其隐式转换为布尔值
  • if 2: print('Yes') 也会打印“Yes”,但您不会期望 print(2) 打印“True”吧?
  • 基于以上两个 cmets- 我是否应该推断以下内容:(a) 在控制台输入内容相当于发出打印,并且 (b) Python 将真值解释为 True仅在 if 语句的上下文中。或者,我错过了一些非常基本的东西。
  • (a)和(b)都错了。
  • 在所有情况下,2 or 3 表达式都会生成 2。然后由控制台直接显示,传递给print 函数,或者传递给if 语句。 if 进行自己的真实性测试。

标签: python


【解决方案1】:

使用or时,Python会返回第一个真值。

print None or 2 #  Prints 2
print 0 or 'Foo' # Prints Foo
print False or True # Prints True

如果第一个值是假的,它会返回第二个,实际上不管它是否为真:

print None or False #  Prints False
print False or None # Prints None
print False or 0 # Prints 0

如果你链接语句,它将首先评估第一个条件,然后是第二个

print None or False or 0 # Will evaluate into ((None or False) or 0)

这在PHPJavaScript 等语言中也是可能的。


来源https://docs.python.org/3/library/stdtypes.html#truth-value-testing

【讨论】:

    【解决方案2】:

    在所有情况下,2 or 3 表达式都会生成 2

    然后由控制台直接显示,传递给print 函数,或者传递给if 语句。

    if 进行自己的真实性测试。

    In [14]: 2 or 3          # or returns the first truthy item
    Out[14]: 2
    In [15]: None or 3
    Out[15]: 3
    In [16]: False or 0 or 2
    Out[16]: 2
    

    print 只显示它的参数:

    In [17]: print(2 or 3)
    2
    

    if 如果参数为真,则执行该操作; else 如果不是:

    In [18]: if 2: print('yes')
    yes
    In [19]: if False: print('yes')
    

    这里它评估or,然后作用于结果:

    In [20]: if None or 2 or 3: print('yes')
    yes
    

    and 返回第一个 falsy,如果没有则返回最后一个

    In [21]: 2 and 3
    Out[21]: 3
    In [22]: 2 and False
    Out[22]: False
    In [23]: 2 and 0 and 3
    Out[23]: 0
    

    【讨论】:

      【解决方案3】:

      or 如果值为 truthy,则返回第一个值,如果第一个值为 falsy (source),则返回第二个值。

      这种行为有时习惯性地用于初始化可变类型的关键字参数:

      def foo(bar=None, zoo=None):
          bar = bar or []
          zoo = zoo or {}
      

      这是 not the unique way 来初始化它们,但你应该是 aware 你不应该使用空列表或字典作为默认参数。

      【讨论】:

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