美文网首页
Python的布尔转换的坑

Python的布尔转换的坑

作者: 东方胖 | 来源:发表于2024-04-10 16:29 被阅读0次

本篇关于 python中 if 表达式的一些坑
从C转到 Python的人,有个习惯

if (someobj_prt) {
// 
}

someobj_prt 是一个指向某个实例的指针,以上的测试等价于

if (someobj_prt != 0) {
}

或(C++11)

if (someobj_prt != nullptr) {
}

Python中有一个None对象
注意 None是一个对象,不是常量

>> None is None # True
>> None == 0 # False
>>  0 is None # SyntaxWarning: "is" with a literal. 字面量不能跟着一个 is 表达式
>> [] == None # False

布尔转换
有些值,字面值及对象转换成 bool 类型会如何
首先 None 会默认变成 False

>> if None:
        print("yes") # 无输出 
>> if not None:
        print("yes") # 输出yes

于是以为——对象不是None 就会变成 yes ——这是个容易被C习惯误导的坑
实际上除了 None,还有一些对象会默认转化为 False
包括

  • list()
  • []
  • {}
  • set()
  • ()
  • 0
  • 0.0
    以上 bool([]), bool({}) bool(0), bool(()) ... 等都是 False ,但是 o is None, o == None 测试结果都是 False

如果一个默认转成 False的对象出现在以下的代码中

if o and len(o) == 0:

if d and key not in d:
    ...

会发生什么?
if o and len(o) == 0:
...
的意思是 如果 o 不是None ——因为如果o是None len(o) 会报出异常,所以使用len()之前测试一下是必要的——代码意图即判断它是不是一个空容器,但是不能如愿以偿,and 左边的空容器已经判定为 False 因而右侧被熔断了,不会运行,当o是一个空列表时,if以下的语句并不会运行,违反初心

第二段代码同理 ,空字典判空变成False,熔断,原本当o是空字典,任何关键字都不可能在其中,所以if 语句下面的代码按照编写意图是要运行的,但是事与愿违。

解决的办法就是抛弃C的习惯
改写成

if o is not None and len(o) == 0:
    ...
if d is not None and key not in d:
    ...

虽然语句变长了,但是接近自然语言的表达

相关文章

网友评论

      本文标题:Python的布尔转换的坑

      本文链接:https://www.haomeiwen.com/subject/fdgqxjtx.html