[python] “y가 아닌 x”또는 “y가 아닌 x”

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

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.


답변

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

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

    Python 문서

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


답변

의미는 동일하지만 pycodestyle Python 스타일 가이드 검사기 (이전에는 pep8이라고 함)E713 규칙not in연산자를 선호합니다 .

E713 : 멤버십 테스트는 not in

“Python if x is not None또는 if not x is None?” 도 참조하십시오. 매우 유사한 스타일을 선택할 수 있습니다.


답변

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

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

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

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


답변

Python에서는 차이가 없습니다. 그리고 선호는 없습니다.


답변

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


답변