Python的max()和min()函数在bool类型中的取值

3

在Python解释器中,

min(True,False)==False
max(True,False)==True

设计保证吗?

2
是的,但是依赖于这个事实的代码可能会设计得很奇怪。 - Wooble
2
min(a,b) == (a and b)max(a,b) == (a or b) 对于布尔值 ab 的翻译。 - Fred Foo
1
@larsmans 可能是一个使用案例,但 all()any() 更适合这种情况。 - glglgl
@glglgl:我并不是在提出一个使用案例,而是在指出原帖应该在处理布尔值时使用andor。当处理它们的序列时,可以使用allany - Fred Foo
4个回答

12

True等于1False等于0


3
在CPython中,似乎boolint的子类。因此,您可以这样做:
>>> abs(False)
0
>>> abs(True)
1

并且:

>>> False < True
True
>>> True > False
True

我猜maxmin函数是基于比较运算符工作的:

>>> cmp(False, True)
-1
>>> cmp(True, False)
1
>>> cmp(False, False)
0
>>> cmp(True, True)
0

1
在所有的Python中,bool 应该是 int 的子类。请参阅 PEP 285 - Steven Rumbalski
@StevenRumbalski:好主意。我猜我只是有点懒,因为我本来是在考虑查看文档的,但你知道,今天是星期五,阳光明媚,我的新太阳镜让我想去买些冰淇淋 ;) - Daren Thomas

3
在Python 2.x中,这是不被保证的,因为你可以覆盖True和False:
>>> False = 23
>>> max(True, False)
23

但是,如果你没有将值指定为True或False,那么根据语言设计,布尔值会作为int的子类,并且具有值0、1和yes(在Python 3中,True和False是保留字,因此无法进行上述操作)。


这是一个有点病态的例子;默认情况下,用False表示的对象仍然等于0:在false = False; False = 23之后,false == 0(或者bool(0) == 0)仍然成立。 - Fred Foo

1
根据文档,在数字上下文中(例如用作算术运算符的参数时),它们分别像整数0和1一样运作。因此,是的,这是有保证的。

“数字上下文”的概念并没有特别明确的定义,不过maxmin函数适用于任何可排序的类型,所以我不确定它们是否符合要求。 - Fred Foo
但我认为这部分确保了-1 < False < True < 2 - glglgl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接