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

Python 列表上的布尔运算意味着什么?,python,boolean,Python,Boolean,我在浏览pyftpdlib的源代码时发现: 如果self.rejected\u用户和self.allowed\u用户: raise AUTHORRERROR(“拒绝的用户和允许的用户选项相互排斥”) 拒绝的用户和允许的用户是列表。 让我困惑的是和操作符如何在两个列表上操作。如果有人帮我,我会很感激的 空列表的计算结果为False,非空列表的计算结果为True 如果列表1和列表2: 相当于: 如果列表1不为空且列表2不为空: : 没有 假的 任何数字类型的零,例如,0,0L,0.0,0j

我在浏览
pyftpdlib
的源代码时发现:

如果self.rejected\u用户和self.allowed\u用户:
raise AUTHORRERROR(“拒绝的用户和允许的用户选项相互排斥”)

拒绝的用户
允许的用户
是列表。
让我困惑的是
操作符如何在两个列表上操作。如果有人帮我,我会很感激的

空列表的计算结果为
False
,非空列表的计算结果为
True

如果列表1和列表2:

相当于:

如果列表1不为空且列表2不为空


:
  • 没有

  • 假的

  • 任何数字类型的零,例如,
    0
    0L
    0.0
    0j

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

  • 任何空映射,例如,
    {}

  • 用户定义类的实例,如果该类定义了
    \uuuu nonzero\uuuu()
    \uuuu len\uuuu()
    方法,当该方法返回整数零或布尔值False时


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

Python中的所有对象都有一个布尔值;在布尔上下文中,它们要么为真,要么为假

空列表是错误的。这适用于所有序列和容器,包括元组、集合、字典和字符串

数字0也为假,因此0、0.0、0j都为假,
None
当然还有
false
本身:

>>> bool([])
False
>>> bool([1, 2])
True
>>> bool(0)
False
>>> bool('')
False
在布尔上下文中,其他一切都被认为是正确的;因此,一个非空列表为真,两个非空列表加上
也被认为是真的

您可以通过实现并返回
0
,使自定义类型看起来像空容器,或者在实例是数字零的布尔等价物时,通过实现*并返回
False
,使自定义类型看起来像数字

只要记住
短路;如果第一个表达式锁定在结果中,则返回该值,同时忽略第二个表达式。对于
,这意味着在表达式
x和y
中,如果
x
为假值(如空列表),则忽略
y
,因为在这种情况下,整个表达式永远不会为真。对于
x或y
,如果
x
为真值,则忽略
y

这些规则都包含在本手册中


*在Python 3中,改用。

如果
列表a
为空,则
列表a和列表b
将计算为
列表a
,否则将计算为
列表b
。例如:

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

除了@Ashwini answer,您还可以使用
bool
内置函数检查给定对象的计算结果

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

在我看来,这似乎是一个逻辑布尔语句。在Python中,构建If语句时,布尔语句有一个有趣的逻辑速记:

bool = True;

If bool:
    return "Blah!"
同:

bool = True;

If bool==True:
    return "Blah!"
语句
If*[boolean]*
是表示
If*[boolean]*为真的更酷的方式。同样,语句
If*!如果*[boolean]*为False,那么用[boolean]*
来表达
是一种更酷的方式,因为
是逻辑的
而不是
操作符。

适应这种逻辑需要一点时间,但一旦适应了,它会使代码看起来更漂亮

那么为什么列表会像布尔值那样做呢

由于Python没有显式的类型声明,所以每个数据类型都有一个布尔表示。对于
拒绝的用户
允许的用户
等列表,如果列表为空
{}
,则返回
,如果不为空,则返回
。因此,英语的翻译

if self.rejected_users and self.allowed_users:
应改为:

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

我希望这能有所帮助。

我可能想添加一些Python文档的链接:@xtofl:我更喜欢链接到更新的文档;我添加了一个参考链接。尽管可能令人恼火,
bool([0])==True
@NickT:这不是一个空列表,没有人说过任何内容。空->假,非空->真。完成。