列表上的布尔运算意味着什么?

时间:2013-09-13 17:58:53

标签: python boolean

我正在浏览pyftpdlib的来源,我发现了这个:

if self.rejected_users and self.allowed_users: raise AuthorizerError("rejected_users and allowed_users options are mutually exclusive")

rejected_usersallowed_users是列表。 令我困惑的是and运算符如何在两个列表上运行。如果有人帮助我,我会很感激的。

5 个答案:

答案 0 :(得分:7)

Python中的所有对象都有一个布尔值'value';它们在布尔上下文中为true或false。

空列表为false。这适用于所有序列和容器,包括元组,集合,字典和字符串。

数字0也是假的,所以0,0.0,0都是假的,None当然也是False本身:

>>> bool([])
False
>>> bool([1, 2])
True
>>> bool(0)
False
>>> bool('')
False

在布尔上下文中,其他所有内容都被认为是真的;所以为空的列表为真,并且两个非空列表和and也被认为是真的。

您可以通过实施__len__()并返回0来使自定义类型看起来像空容器,或者通过实现__nonzero__() * 并返回{来看起来像一个数字{1}}当实例是数字零的布尔等价物时。

请记住Falseand短路;如果第一个表达式锁定结果,则返回该值,并且完全忽略第二个表达式。对于or,这意味着在表达式and中,如果x and y是假值(如空列表),则忽略y,因为整个表达式永远不会是在这种情况下是真的。对于x,如果x or y为真值,则忽略y

这些规则均由Boolean operations reference documentation涵盖。

* 在Python 3中,使用__bool__代替

答案 1 :(得分:4)

空列表评估为False,非空列表评估为True

if list1 and list2:

相当于:

if list1 is not empty and list2 is not empty


List of falsy values in python

  • 任何数字类型的零,例如00L0.00j

  • 任何空序列,例如''()[]

  • 任何空映射,例如{}

  • 用户定义类的实例,如果类定义了 __nonzero__()__len__()方法,当该方法返回整数零或bool值False时。

所有其他值都被认为是真的 - 因此许多类型的对象始终为真。

答案 2 :(得分:1)

如果list_a为空,则list_a and list_b将评估为list_a,否则评估为list_b。例如:

>>> [1] and [2]
[2]
>>> [] and [2]
[]

答案 3 :(得分:1)

除了@Ashwini答案之外,您还可以使用bool内置函数来检查给定对象将评估的内容。

>>> bool([])
False
>>> bool([1,2,3])
True
>>> bool('')
False
>>> bool('hello')
True

答案 4 :(得分:0)

它看起来好像是一个逻辑布尔语句。在Python中,当构建If语句时,布尔语句有一个有趣的逻辑简写:

bool = True;

If bool:
    return "Blah!"

与:

相同
bool = True;

If bool==True:
    return "Blah!"

声明If *[boolean]*是一种更温和的说法If *[boolean]* is True。以同样的方式,语句If *![boolean]*是说If *[boolean]* is False的一种较冷的方式,因为!是逻辑NOT运算符。

需要有一点时间适应这种逻辑,但一旦你这样做,它会使你的代码更好看。

那么为什么列表应该像布尔值一样呢?

由于Python没有显式类型声明,因此每种数据类型都有一个布尔表示。对于rejected_usersallowed_users等列表,如果列表为空{},则返回False,如果不为空,则返回True。因此,

的英文翻译
if self.rejected_users and self.allowed_users:

应为:

if self.rejected_users is NOT empty AND if self.allowed_users is NOT empty:

我希望这会有所帮助。