【问题标题】:one or the other in if statement [duplicate]if语句中的一个或另一个[重复]
【发布时间】:2018-04-30 15:34:22
【问题描述】:

首先我们有这个:

def some(a):
    if a is None or "*":
         print "*"
    else:
         print a

>>> some("*")
    *
>>> some("d")
    *

它失败了,但我无法给自己一个足够好的失败原因。 显然是因为我写错了,一个工作版本是:

def some(a):
    if a in [None, "*"]: # or write [ if a is None or a is "*" ]
         print "*"
    else:
         print a


   >>> some("*")
       *
   >>> some("d")
       d

尽管编写正确的版本几乎足够直观,但我无法向自己解释第一个版本失败的原因。

所以问题是,为什么第一个版本失败了?

【问题讨论】:

  • 另请注意,“工作”版本应为a in [None, "*"]。如您所写,(None or "*") 被评估为布尔表达式,它将返回第一个 True 等效组件,即 "*"。然后你的代码将测试a is "*"。试试some(None) 看看我的意思。
  • @MatthiasFripp 感谢您的注意,我确实错过了那部分,它应该放在方括号中。

标签: python if-statement logical-operators


【解决方案1】:

声明:

if a is None or "*":

语义上的意思

if ((a is None) is True) or (the value "*" is True)

而值"*",作为一个非空字符串总是True。因此,整个表达式的计算结果为True

【讨论】:

  • 啊哈!时刻,非常感谢。确实,这很有道理。
【解决方案2】:

这将始终评估为 True

 if a is None or "*":

如果你愿意,你可以这么说

 if a is None or a== "*":

【讨论】:

    【解决方案3】:

    以下语句不符合您的预期:

    if a is None or "*":
    

    这相当于:

    if (a is None) or "*":
    

    所以它总是True。要获得您想要的行为,请使用:

    if a is None or a == "*":
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-06
      • 1970-01-01
      • 1970-01-01
      • 2020-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多