멤버십을 테스트 할 때 다음을 사용할 수 있습니다.
x not in y
또는 :
not x in y
x
및 에 따라이 표현식에 대해 가능한 많은 컨텍스트가있을 수 있습니다 y
. 예를 들어 하위 문자열 검사, 목록 멤버십, dict 키 존재 등이 될 수 있습니다.
- 두 형식은 항상 동일합니까?
- 선호하는 구문이 있습니까?
답변:
그들은 항상 동일한 결과를 제공합니다.
사실, not 'ham' in 'spam and eggs'
"in"연산이 아닌 단일 "not in"연산을 수행 한 다음 결과를 부정하는 특수한 경우 인 것처럼 보입니다.
>>> import dis
>>> def notin():
'ham' not in 'spam and eggs'
>>> dis.dis(notin)
2 0 LOAD_CONST 1 ('ham')
3 LOAD_CONST 2 ('spam and eggs')
6 COMPARE_OP 7 (not in)
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
>>> def not_in():
not 'ham' in 'spam and eggs'
>>> dis.dis(not_in)
2 0 LOAD_CONST 1 ('ham')
3 LOAD_CONST 2 ('spam and eggs')
6 COMPARE_OP 7 (not in)
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
>>> def not__in():
not ('ham' in 'spam and eggs')
>>> dis.dis(not__in)
2 0 LOAD_CONST 1 ('ham')
3 LOAD_CONST 2 ('spam and eggs')
6 COMPARE_OP 7 (not in)
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
>>> def noteq():
not 'ham' == 'spam and eggs'
>>> dis.dis(noteq)
2 0 LOAD_CONST 1 ('ham')
3 LOAD_CONST 2 ('spam and eggs')
6 COMPARE_OP 2 (==)
9 UNARY_NOT
10 POP_TOP
11 LOAD_CONST 0 (None)
14 RETURN_VALUE
처음에는 항상 동일한 결과를 제공한다고 생각했지만 not
그 자체로는 a in b
다른 부울 표현식처럼 쉽게 적용 할 수있는 낮은 우선 순위의 논리 부정 연산자 인 반면 not in
편리함과 명확성을위한 별도의 연산자라고 생각했습니다. .
위의 분해가 드러났습니다! not
분명히 논리 부정 연산자이지만 형식 not a in b
은 실제로 일반 연산자를 사용하지 않도록 특수한 경우로 보입니다 . 이것은 단순히 동일한 값을 생성하는 표현식이 아니라 not a in b
문자 그대로와 동일한 표현식을 만듭니다 a not in b
.
not x in xs
은 not (x in xs)
. 그러나이 같은 똑같은 바이트 코드로 파싱에 의해 구현 있다는 사실 x not in xs
같은 것들에 반대, 그들은 항상 동일해야한다는 것을 분명하게 보여줍니다 not x == y
대 x != y
한 해야 동일한 결과를 제공,하지만의 구현에 따라 (필요 없어 __eq__
및 __ne__
관련).
의미는 동일하지만 pycodestyle Python 스타일 가이드 검사기 (이전에는 pep8이라고 함) 는 E713 규칙 의 not in
연산자를 선호합니다 .
E713 : 멤버십 테스트는
not in
"Python if x is not None
또는 if not x is None
?" 도 참조하십시오. 매우 유사한 스타일을 선택할 수 있습니다.
다른 사람들은 이미 두 진술이 매우 낮은 수준으로 동등하다는 것을 매우 분명히했습니다.
하지만 아직 선택의 여지가있을만큼 스트레스를받은 사람은 없다고 생각합니다.
물론 그것이 목표로하는 좋은 일이더라도 반드시 가능한 한 누구나 읽을 수있는 것은 아닙니다. 아니, 확인 코드는 가능한 한 읽을 수 있도록 당신에게 당신이 가장 가능성이 나중에이 코드에 다시 와서 그것을 읽으려고하는 사람이기 때문에.
Python에서는 차이가 없습니다. 그리고 선호는 없습니다.
not x in xs
문서에서 언급조차 찾을 수 없습니다 .