Python if x is not None
还是if not x is None
?
TLDR:字节码编译器将它们都解析为x is not None
-为了便于阅读,请使用if x is not None
。
可读性
我们之所以使用Python,是因为我们重视诸如人类可读性,可用性和各种编程范式的正确性之类的东西,而不是性能。
Python针对可读性进行了优化,尤其是在这种情况下。
解析和编译字节码
的not
结合更弱比is
,所以这里没有逻辑的差异。请参阅文档:
运算符is
并is not
测试对象标识:x is y
当且仅当x和y是同一对象时才为true。x is not y
产生反真值。
将is not
有具体规定,在Python 语法作为语言可读性改善:
comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not'
因此,它也是语法的一个统一要素。
当然,它的解析方式不同:
>>> import ast
>>> ast.dump(ast.parse('x is not None').body[0].value)
"Compare(left=Name(id='x', ctx=Load()), ops=[IsNot()], comparators=[Name(id='None', ctx=Load())])"
>>> ast.dump(ast.parse('not x is None').body[0].value)
"UnaryOp(op=Not(), operand=Compare(left=Name(id='x', ctx=Load()), ops=[Is()], comparators=[Name(id='None', ctx=Load())]))"
但是字节编译器实际上会将转换not ... is
为is not
:
>>> import dis
>>> dis.dis(lambda x, y: x is not y)
1 0 LOAD_FAST 0 (x)
3 LOAD_FAST 1 (y)
6 COMPARE_OP 9 (is not)
9 RETURN_VALUE
>>> dis.dis(lambda x, y: not x is y)
1 0 LOAD_FAST 0 (x)
3 LOAD_FAST 1 (y)
6 COMPARE_OP 9 (is not)
9 RETURN_VALUE
因此,为了便于阅读并按预期使用语言,请使用is not
。
不使用它是不明智的。
is not
本身就是一个运算符。像!=
。如果你喜欢not x is None
那么你也应该喜欢not a == b
过a != b
。