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。