3

在 python 中,进行如下构造是有效的:

def a(): 
    return 0

if a: 
    print "Function object was considered True"
else:  
    print "Function object was considered False"

我想问一个函数指针被评估为 True 的逻辑是什么。

为什么要在语言中插入这种结构?

4

4 回答 4

13

很多东西都True在 Python 中进行评估。从有关布尔运算符的文档中

在布尔运算的上下文中,以及当控制流语句使用表达式时,以下值被解释为 false:False, None, 所有类型的数字零,以及空字符串和容器(包括字符串、元组、列表、字典、集合和冻结集)。所有其他值都被解释为 true。

Python 中的函数和很多东西一样,都是对象,而不是空的。因此,在布尔上下文中,它们评估为 True。

于 2012-10-02T19:59:43.663 回答
3

评估“真实性”的规则在 Python 文档中关于Truth Value Testing的章节中。

特别注意

所有其他值都被认为是真的——所以许多类型的对象总是真的。

综上所述; 函数对象始终为真。

于 2012-10-02T20:00:17.720 回答
2

python 中为 False 的对象列表:

  • None
  • []
  • {}
  • empty set
  • empty frozenset
  • False
  • 0
  • 0.0
  • 0L
  • 0j
  • 空的defaultdict
  • Classes已实现__nonzero__()方法并返回虚假值的,否则__len__()将被调用。在 python 3x中__bool__()替换了__nonzero__().
于 2012-10-02T20:00:06.953 回答
1

在@Magnus Hoff 链接到的真值测试中,我发现最有启发性的陈述是:

默认情况下,除非对象的类定义了返回 False的 _ bool _() 方法或返回零的 _ len _() 方法,否则对象被认为是 true,当与对象一起调用时。

我尝试定义自己的类,似乎 _ bool _() 优先于 _ len _(),这是有道理的:

class Falsish(object):
    def __init__(self):
        self.val = "False, even though len(self) > 0"
    def __bool__(self):
        return False
    def __len__(self):
        return 2

class StillFalsish(object):
    def __init__(self):
        self.val = "False, even though len(self) > 0"
    def __len__(self):
        return 2
    def __bool__(self):
        return False

class Truish(object):
    def __init__(self):
        self.val = "True, even though len(self) = 0"
    def __bool__(self):
        return True
    def __len__(self):
        return 0

class StillTruish(object):
    def __init__(self):
        self.val = "True, even though len(self) = 0"
    def __len__(self):
        return 0
    def __bool__(self):
        return True

class NowFalsish(object):
    def __init__(self):
        self.val = "False, with no __bool__(), since len(self) = 0"
    def __len__(self):
        return 0

class NowTruish(object):
    def __init__(self):
        self.val = "True, with no __bool__(), since len(self) > 0"
    def __len__(self):
        return 2

class EvenThisIsTruish(object):
    pass


mybool1 = Falsish()
mybool2 = StillFalsish()
mybool3 = Truish()
mybool4 = StillTruish()
mybool5 = NowFalsish()
mybool6 = NowTruish()
mybool7 = EvenThisIsTruish()
if mybool1: print("mybool1 is true")
if mybool2: print("mybool2 is true")
if mybool3: print("mybool3 is true")
if mybool4: print("mybool4 is true")
if mybool5: print("mybool5 is true")
if mybool6: print("mybool6 is true")
if mybool7: print("mybool7 is true")

上述代码的输出是:

mybool3 is true
mybool4 is true
mybool6 is true
mybool7 is true
于 2020-05-21T14:17:34.137 回答