在python中,构建如下构造是有效的:
def a():
return 0
if a:
print "Function object was considered True"
else:
print "Function object was considered False"
我想问一下函数指针被评估为True的逻辑是什么。
为什么这种结构插入语言?
答案 0 :(得分:10)
很多东西在Python中评估为True
。来自documentation on Boolean operators:
在布尔运算的上下文中,以及控制流语句使用表达式时,以下值被解释为false:
False
,None
,所有类型的数字零和空字符串和容器(包括字符串,元组,列表,字典,集合和frozensets)。所有其他值都被解释为true。
Python中的函数与许多东西一样,是对象,而不是空的。因此,在布尔上下文中,它们计算为True。
答案 1 :(得分:2)
答案 2 :(得分:1)
python中的False对象列表:
None
[]
{}
empty set
empty frozenset
False
0
0.0
0L
0j
defaultdict
Classes
已实施__nonzero__()
方法且返回虚假值
否则调用__len__()
。在python 3x中__bool__()
替换了__nonzero__()
。答案 3 :(得分:1)
在@Magnus Hoff链接的真值测试中,我发现最有启发性的陈述是:
默认情况下,除非对象的类定义了返回False的_ bool _()方法或返回了__em的 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