本篇关于 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:
...
虽然语句变长了,但是接近自然语言的表达
网友评论