파이썬 if x is not None
또는 if not x is None
?
TLDR : 바이트 코드 컴파일러는 그것들을 모두 분석하기 x is not None
때문에 가독성 을 위해을 사용하십시오 if x is not None
.
가독성
우리는 성능에 대한 프로그래밍의 다양한 패러다임의 인간 가독성, 사용성 및 정확성과 같은 것을 중요하게 생각하기 때문에 Python을 사용합니다.
파이썬은 특히이 문맥에서 가독성을 최적화합니다.
바이트 코드 파싱 및 컴파일
not
더 약하게 바인딩 이상은 is
, 그래서 여기에 논리적 차이가 없다. 설명서를 참조하십시오 :
x와 y가 동일한 객체 인 경우에만 연산자 is
및 is not
객체 동일성 테스트 : x is y
true입니다. x is not y
역 진리 값을 산출합니다.
이 언어 is not
는 파이썬 문법 에서 언어의 가독성 향상을 위해 특별히 제공 됩니다.
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
.