Rumah > Soal Jawab > teks badan
google 的 python 风格指南中这么说:
Beware of writing
if x:
when you really meanif x is not None:
—e.g., when testing whether a variable or argument that defaults to None was set to some other value. The other value might be a value that's false in a boolean context!
也就是说,推荐使用 if x is not None
进行判断,but why?
PHP中文网2017-04-17 13:38:45
内容和标题不符,if x
和 if not x is None
是不一样的。
if x
会对x做 __nonzero__ 判断,当 x 为 ''(空字符串),{}(空字典), 0 的时候都是 False。当你确实要判断一个变量不是 None 的时候,应该用 if x is not None
。
至于 if not x is None
和 if x is not None
是一样的,选一个你读的顺的就好。
黄舟2017-04-17 13:38:45
首先,直接查看操作码(XP+Python3.4)。x is not None
的操作码:
dis.dis('if x is not None: pass')
0 LOAD_NAME 0 (x)
3 LOAD_CONST 0 (None)
6 COMPARE_OP 9 (is not)
9 POP_JUMP_IF_FALSE 15
12 JUMP_FORWARD 0 (to 15)
>> 15 LOAD_CONST 0 (None)
18 RETURN_VALUE
if not x is None
的操作码:
dis.dis('if not x is None: pass')
0 LOAD_NAME 0 (x)
3 LOAD_CONST 0 (None)
6 COMPARE_OP 9 (is not)
9 POP_JUMP_IF_FALSE 15
12 JUMP_FORWARD 0 (to 15)
>> 15 LOAD_CONST 0 (None)
18 RETURN_VALUE
可以看到,操作码是一样的!
题主还可以测试后面加or或者and的情况。
个人意见,if x is not None
比if not x is None
更加易读,毕竟英语当中有一个 isn't 呢。
PHPz2017-04-17 13:38:45
if not x is None
和 if x is not None
對計算機而言是一樣的。對人類而言是不一樣的。
前者的隱含意義是x本該是None結果不是,後者是x不該是None結果也不是。個人感覺,無客觀依據(好像沒有人做這樣的心理實驗?)。
PHP中文网2017-04-17 13:38:45
假如原本你的x
为None
你要执行如下代码判断x
是否已经发生改变,仍为None
?
x = False
if x:
print 'yes'
else:
print 'no'
你得到会是 no
,其实 x
已经被改变了,但仍然是False
if not x is None
和 if x is not None
结果是一样的。
if not x is None
=> if not (x is None)
if x is not None
=> if x (is not) None