在Python中,空列表被视为Falsey值因此,事情应该是这样运作的:
>>> [] and False False
但实际上,python返回的是一个空列表。
>>> [] and False []
这是有意的还是错误?
k4emjkb11#
这是有意的。and和or都被定义为返回最后一个 * 求值 * 的值(基于短路),而不是实际的True或False。对于and,这意味着它返回第一个falsy值(如果有的话)和最后一个值(不管真实性如何),如果所有其他值都是真实的话。在添加条件表达式之前,它特别有用,因为它允许您执行一些几乎等效的黑客攻击,例如在添加条件表达式之前:
and
or
True
False
b if a else c
可以写成:
a and b or c
并且,假设b本身是某个真实的东西,那么它的行为将是等价的(条件表达式没有这个限制,并且对于意图更清楚,这就是为什么添加它)。即使在今天,这个特性偶尔对于用一些更特定类型的缺省值替换所有错误值是有用的,例如当lst可能作为None或list传递时,您可以确保它是list,并且:
b
lst
None
list
lst = lst or []
用一个新的空list廉价地替换None(以及任何其他错误的东西)。
iyfamqjs2#
这就是它的工作原理。and只在左手操作数为真时返回右操作数。由于[]为假,and返回左操作数。
[]
muk1a3rh3#
在Python中,对象的真实性是由内置的bool()函数决定的,该函数对于空序列返回False(如空列表、元组和字符串)和任何数值类型的零。但是,当用作and运算符的操作数时,操作数不会转换为布尔值,而是使用它们的实际值,所以在这个例子中,and运算符没有检查真实性,而是返回它遇到的第一个错误值,在这个例子中是一个空列表,所以它返回一个空列表。
bool()
af7jpaap4#
这完全是意料之中的行为。要理解它,你需要知道布尔运算符(and,or,not)是如何工作的。表达式x and y首先计算x;如果x为假,则返回其值;否则,计算y并返回结果值。现在让我们考虑一下你的例子:这里,由于[]是 falsey,因此它的值由语句返回,返回值为[]。上面链接的Python文档明确提到:注意:and和or都不限制返回False和True的值和类型,而是返回最后一个求值的参数。但是,如果需要返回布尔值,可以使用**bool()**函数将值显式类型转换为True或False。例如,在您的情况下,它将返回False:
not
x and y
x
y
>>> bool([] and False) False
4条答案
按热度按时间k4emjkb11#
这是有意的。
and
和or
都被定义为返回最后一个 * 求值 * 的值(基于短路),而不是实际的True
或False
。对于and
,这意味着它返回第一个falsy值(如果有的话)和最后一个值(不管真实性如何),如果所有其他值都是真实的话。在添加条件表达式之前,它特别有用,因为它允许您执行一些几乎等效的黑客攻击,例如在添加条件表达式之前:
可以写成:
并且,假设
b
本身是某个真实的东西,那么它的行为将是等价的(条件表达式没有这个限制,并且对于意图更清楚,这就是为什么添加它)。即使在今天,这个特性偶尔对于用一些更特定类型的缺省值替换所有错误值是有用的,例如当lst
可能作为None
或list
传递时,您可以确保它是list
,并且:用一个新的空
list
廉价地替换None
(以及任何其他错误的东西)。iyfamqjs2#
这就是它的工作原理。
and
只在左手操作数为真时返回右操作数。由于[]
为假,and
返回左操作数。muk1a3rh3#
在Python中,对象的真实性是由内置的
bool()
函数决定的,该函数对于空序列返回False(如空列表、元组和字符串)和任何数值类型的零。但是,当用作and
运算符的操作数时,操作数不会转换为布尔值,而是使用它们的实际值,所以在这个例子中,and
运算符没有检查真实性,而是返回它遇到的第一个错误值,在这个例子中是一个空列表,所以它返回一个空列表。af7jpaap4#
这完全是意料之中的行为。要理解它,你需要知道布尔运算符(
and
,or
,not
)是如何工作的。表达式
x and y
首先计算x
;如果x
为假,则返回其值;否则,计算y
并返回结果值。现在让我们考虑一下你的例子:这里,由于
[]
是 falsey,因此它的值由语句返回,返回值为[]
。上面链接的Python文档明确提到:
注意:
and
和or
都不限制返回False
和True
的值和类型,而是返回最后一个求值的参数。但是,如果需要返回布尔值,可以使用**
bool()
**函数将值显式类型转换为True
或False
。例如,在您的情况下,它将返回False: