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:这不是一个空列表,没有人说过任何内容。空->假,非空->真。完成。