"y가 아닌 x"또는 "y가 아닌 x"


97

멤버십을 테스트 할 때 다음을 사용할 수 있습니다.

x not in y

또는 :

not x in y

x및 에 따라이 표현식에 대해 가능한 많은 컨텍스트가있을 수 있습니다 y. 예를 들어 하위 문자열 검사, 목록 멤버십, dict 키 존재 등이 될 수 있습니다.

  • 두 형식은 항상 동일합니까?
  • 선호하는 구문이 있습니까?

답변:


112

그들은 항상 동일한 결과를 제공합니다.

사실, 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.


4
이는 구현 세부 사항 일뿐입니다. not x in xs문서에서 언급조차 찾을 수 없습니다 .
phant0m

1
@ phant0m 물론입니다. 당신이 생각해야 할 방식 not x in xsnot (x in xs). 그러나이 같은 똑같은 바이트 코드로 파싱에 의해 구현 있다는 사실 x not in xs같은 것들에 반대, 그들은 항상 동일해야한다는 것을 분명하게 보여줍니다 not x == yx != y해야 동일한 결과를 제공,하지만의 구현에 따라 (필요 없어 __eq____ne__관련).
Ben

11
당신은으로 실행했습니다 CPython을 들여다 보는 구멍 최적화 ; Jython 및 IronPython과 같은 다른 Python 구현이 자유롭게 무시하거나 복사 할 수있는 컴파일 타임 최적화입니다 (언어 사양의 일부가 아님).
Martijn Pieters

15

  1. 아니요, 차이가 없습니다.

    연산자 not in는 역 참 값을 갖도록 정의됩니다 in.

    Python 문서

  2. 나는 not in그것이 더 분명하고 특별한 경우를 추가했기 때문에 선호 한다고 가정 합니다.



3

다른 사람들은 이미 두 진술이 매우 낮은 수준으로 동등하다는 것을 매우 분명히했습니다.

하지만 아직 선택의 여지가있을만큼 스트레스를받은 사람은 없다고 생각합니다.

가능한 한 코드를 읽을 수있는 형식을 선택하십시오.

물론 그것이 목표로하는 좋은 일이더라도 반드시 가능한 한 누구나 읽을 수있는 것은 아닙니다. 아니, 확인 코드는 가능한 한 읽을 수 있도록 당신에게 당신이 가장 가능성이 나중에이 코드에 다시 와서 그것을 읽으려고하는 사람이기 때문에.


대규모 팀에서 작업하거나 잠시 동안 손대지 않은 코드로 작업하는 경우 다른 사람이 유지 관리해야 할 가능성이 더 높습니다.
Tommy Herbert


1

구문 적으로 그들은 동일한 진술입니다. 나는 'ham' not in 'spam and eggs'더 명확한 의도 를 전달 한다고 빨리 말할 수 있지만 not 'ham' in 'spam and eggs'다른 것보다 더 명확한 의미 를 전달하는 코드와 시나리오를 보았습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.