【问题标题】:Python lambda returns true even with a false condition即使在错误条件下,Python lambda 也会返回 true
【发布时间】:2018-05-09 13:10:09
【问题描述】:
>>> if lambda x: True == True:
... print('yes')
...
yes
>>> if lambda x: False == True:
... print('yes')
...
yes

【问题讨论】:

  • 你有什么问题?
  • 我需要以某种方式使用 lamda,以便它评估
  • @ApoorvMishra lambda 应该被称为。而且你可能不在那里x
  • 为什么不添加问题?你的问题完全没有问题!
  • 了解更多关于 lambda 函数的信息:secnetix.de/olli/Python/lambda_functions.hawk

标签: python lambda


【解决方案1】:

您没有像我在评论中解释的那样调用您的 lambda,但如果您希望它内联,您可以测试为:

if (lambda x: True == True)(None):
    print("yes")  # prints

if (lambda x: False == True)(None):
    print("yes")  # doesn't print

或更笼统地说,因为您实际上并没有在 lambdas 中使用任何参数:

if (lambda: True == True)():
    print("yes")  # prints

if (lambda: False == True)():
    print("yes")  # doesn't print

【讨论】:

  • zwer 解决方案符合我的目的!和 bruno desthuilliers 为我介绍了 lambda 表达式的概念
  • 请注意,这里使用 lambda(在同一个表达式中定义和调用)仍然是对 CPU 和程序员时间的无用浪费(换句话说,一个完整的 WTF) - 你会得到用它们的身体替换 lambda 的结果非常相似,即 if (True == True)if (True == False):
  • @brunodesthuilliers - 绝对如此。偏移表达式以调用包含在 lambda 函数中的表达式是一种毫无意义的练习。
【解决方案2】:

lambda 中的检查无关。发生的事情是这样的:

>>bool(lambda x: <anything>)  # 1
True

1.当然,只要没有提出SyntaxError

【讨论】:

    【解决方案3】:

    您没有调用您的 lambda。您在这里所做的是测试 lambda 对象本身(实际上是 function 对象)的布尔值,这当然总是正确的。

    如果你想测试 lambda 的结果,你必须调用它——在你的情况下,你必须给它传递一个参数,因为你定义它有一个参数:

    if (lambda x: True)(42):
       print("yes")
    
    if (lambda x: False)(42):
       print("no")
    

    现在这在您的 sn-p 中实际上没有意义,因为 Python lambda 被限制为单个表达式,因此您也可以将整个 (lambda x: whatever_expression)(whatever_value) 替换为 whatever_expression

    正如 Chepner 提到的,您的 if 条件实际上被解析为:

    if (lambda x: True == True):
    

    不是:

    if (lambda x: True) == True:
    

    这在这里并没有太大的区别,因为正如我首先解释的那样,这里测试的是 lambda function 对象本身的布尔值,但无论如何...作为一般规则,明确测试 True 或 @ 987654330@ 在 python 中没用 - 所有对象都有一个布尔值,所有表达式都产生对象,所以这个

    if some_expression == True:
    

    相同
    if some_expression:
    

    【讨论】:

      【解决方案4】:

      您的代码的解析方式与

      相同
      if (lambda x: (True == True)):
          print('yes')
      

      这意味着您正在定义一个始终返回 True 的函数,然后检查该 函数 是否具有真值,因为所有 function 对象都是真值。

      你想调用带有一些参数的函数;对于这个例子,我只是创建了一个任意的 object 实例,但参数可以是 anything

      if (lambda x: True)(object()) == True
          print('yes')
      

      如果你把它分成多行更容易看到:

      f = lambda x: True
      some_arg = object()
      if f(some_arg) == True:   # or just if f(some_arg):
          print('yes')
      

      【讨论】:

      • ...之所以这样做,是因为它只是一个对象。 不完全是。假设作为一个对象自动限定它的真实性,这是不真实的(双关语)。
      • 我应该说object(或者更具体地说,function),而不是反对。
      【解决方案5】:
      True_X = lambda x: True
      False_X = lambda x: False
      Not_X = lambda x: (True if x == False else False)
      

      【讨论】:

      • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
      猜你喜欢
      • 1970-01-01
      • 2017-09-07
      • 1970-01-01
      • 2021-11-30
      • 1970-01-01
      • 2020-04-02
      • 1970-01-01
      • 1970-01-01
      • 2012-12-08
      相关资源
      最近更新 更多