“[False, True]의 not (True)”이 False를 반환하는 이유는 무엇입니까?


483

내가 이렇게하면 :

>>> False in [False, True]
True

반환합니다 True. False목록에 있기 때문에 간단 합니다.

그러나 내가하면 :

>>> not(True) in [False, True]
False

반환합니다 False. 반면 not(True)False:

>>> not(True)
False

왜?



2
당신의 괄호에 혼란not(True) in [False, True]
그리 예시 쇼한

답변:


730

연산자 우선 순위 2.X , 3.X . 의 우선 순위가의 우선 순위보다 not낮습니다 in. 따라서 다음과 같습니다.

>>> not ((True) in [False, True])
False

이것은 당신이 원하는 것입니다 :

>>> (not True) in [False, True]
True

@ 벤이 지적 하듯이 : 그것은 쓰기 결코에게 권장 not(True)선호하지 않습니다 not True. 전자는 함수 호출처럼 보이지만 함수 not는 아닌 연산자입니다.


279
@ Texom512 : 나는 절대로 글을 쓰지 않는 것이 좋습니다 not(True); 선호합니다 not True. 첫 번째는 함수 호출처럼 보이게합니다. 경우 not함수이고, 다음 not(True) in ...아마도 수 없습니다 not ((True) in ...). 당신은 그것이 연산자라는 것을 알아야합니다.
Ben

7
또한 독자의 이익을 위해 우선 순위를 표시하기 위해 간격을 사용하려는 경우 먼저 자신이 올바른지 확인하십시오. 글을 쓰는 것은 괜찮을 것입니다 . a + b*c + d글을 쓰는 것은 매우 나쁩니다 a+b * c+d. 그래서 not(True)그 조치로도 나쁘다.
Steve Jessop

32
실제로, 절대 쓰지 마십시오not True . False대신 쓰십시오 .
Darkhogg

10
아마도 실제 생활에서 당신이 작성되지 않을 것이다 not True, 당신은 같은 것을 쓰는 거라고 not myfunc(x,y,z)경우 myfunc일부 기능이 반환 True또는 False.
네이트 CK

3
@ BenC.R.Leggiero 원래 답변 에서 내가 한 일이며 다른 사람들이 수정했습니다. 현재 버전은 나를 위해 충분히 명확합니다. 중요한 괄호가 없으면 이해하기 어렵다고 생각하지 않습니다. 핵심 문제가 지적되었으므로 나머지를 이해하는 것이 프로그래머의 기본 기술입니다.
유 하오

76

not x in y 로 평가된다 x not in y

코드를 분해하여 무슨 일이 일어나고 있는지 정확히 알 수 있습니다. 첫 번째 경우는 예상대로 작동합니다.

>>> x = lambda: False in [False, True]
>>> dis.dis(x)
  1           0 LOAD_GLOBAL              0 (False)
              3 LOAD_GLOBAL              0 (False)
              6 LOAD_GLOBAL              1 (True)
              9 BUILD_LIST               2
             12 COMPARE_OP               6 (in)
             15 RETURN_VALUE

두 번째 경우 True not in [False, True]는 다음과 같이 False명확하게 평가됩니다 .

>>> x = lambda: not(True) in [False, True]
>>> dis.dis(x)
  1           0 LOAD_GLOBAL              0 (True)
              3 LOAD_GLOBAL              1 (False)
              6 LOAD_GLOBAL              0 (True)
              9 BUILD_LIST               2
             12 COMPARE_OP               7 (not in)
             15 RETURN_VALUE        
>>> 

당신이 대신 표현하고 싶었던 (not(True)) in [False, True]것은 예상대로입니다 True. 그리고 당신은 이유를 볼 수 있습니다 :

>>> x = lambda: (not(True)) in [False, True]
>>> dis.dis(x)
  1           0 LOAD_GLOBAL              0 (True)
              3 UNARY_NOT           
              4 LOAD_GLOBAL              1 (False)
              7 LOAD_GLOBAL              0 (True)
             10 BUILD_LIST               2
             13 COMPARE_OP               6 (in)
             16 RETURN_VALUE        

13
항상 사람이 dis있지만 실제로 not in사용됨을 보여주기 때문에 매우 귀중한 답변 입니다
jamylak

21
바이트 코드는 CPython 인터프리터의 구현 세부 사항입니다. 이것은 파이썬 질문에 대한 CPython의 답변입니다. 실제로 언어 참조에서 직접 더 잘 대답 할 수 있습니다.
wim

5
@wim 바이트 코드 구현이 실제 디스 어셈블리만큼 중요하지 않다고 주장합니다. 다른 구현에서는 기능적으로 동일한 것을 생성 할 수 있으므로 한 분해를 이해하면 "수준"을 이해하고 낮은 수준의 "방법"을 이해하기에 충분한 통찰력을 제공합니다.
Alex Pana

36

운영자 우선 순위. in보다 더 긴밀하게 바인딩 not되므로 표현식이와 동일합니다 not((True) in [False, True]).


33

그것은 모든 약의 연산자 우선 순위 ( in보다 강 not). 그러나 올바른 위치에 괄호를 추가하면 쉽게 수정할 수 있습니다.

(not(True)) in [False, True]  # prints true

쓰기:

not(True) in [False, True]

같은 것입니다 :

not((True) in [False, True])

True목록에 있는지 확인 하고 결과의 "not"을 반환합니다.


14

그것은으로 평가하고 not True in [False, True]있는 반환 False하기 때문 True이다[False, True]

당신이 시도하면

>>>(not(True)) in [False, True]
True

예상 결과를 얻습니다.


13

우선 순위 not가 ~보다 낮은 다른 답변과 함께 in실제로 귀하의 진술은 다음과 같습니다.

not (True in [False, True])

그러나 다른 조건과 조건을 분리하지 않으면 파이썬은이 를 분리하기 위해 두 가지 역할 ( precedence또는 chaining)을 사용 하며이 경우에는 파이썬이 우선 순위를 사용합니다. 또한 조건을 분리하려면 객체 또는 값뿐만 아니라 모든 조건을 괄호 안에 넣어야합니다.

(not True) in [False, True]

그러나 언급했듯이 체인을 연결 하는 연산자에서 파이썬에 의한 또 다른 수정이 있습니다. .

파이썬 문서를 기반으로 :

비교, 멤버쉽 테스트 및 동일성 테스트는 모두 우선 순위가 같 으며 비교 섹션에 설명 된대로 왼쪽에서 오른쪽으로 연결 기능이 있습니다.

예를 들어 다음 문장의 결과는 다음과 같습니다 False.

>>> True == False in [False, True]
False

파이썬은 다음과 같은 문장을 연결하기 때문에 :

(True == False) and (False in [False, True])

어느 정확히 False and TrueFalse .

중앙 객체가 2 개의 작업과 다른 객체간에 공유된다고 가정 할 수 있습니다 (이 경우 False).

그리고 피연산자를 따르는 멤버십 테스트 및 신원 테스트 작업을 포함하여 모든 비교에 대해서도 마찬가지입니다.

in, not in, is, is not, <, <=, >, >=, !=, ==

예 :

>>> 1 in [1,2] == True
False

또 다른 유명한 예는 숫자 범위입니다.

7<x<20

이는 다음과 같습니다.

7<x and x<20   

6

컬렉션 억제 검사 작업으로 보자. [False, True] 일부 요소가 포함 된 목록입니다.

표현식 True in [False, True]은 다음 True과 같이를 반환합니다 .True 목록에 포함 된 요소 합니다.

따라서 연산자 보다 우선 순위가 높으므로 우선 순위를 유지하기 위해 괄호없이 위의 표현식의 결과 인 not True in [False, True]"부울 반대"를 제공합니다 . 따라서 결과가 발생 합니다.notinnotnot TrueFalse

한편, (not True) in [False, True]동일하다 False in [False, True]된다 True( False리스트에 포함된다).


6

다른 답변 중 일부를 명확히하기 위해 단항 연산자 뒤에 괄호 추가 해도 우선 순위가 변경되지 않습니다. not(True)not더 밀접하게 바인딩 하지 않습니다 True. 주변에 괄호가 중복되어 있습니다 True. 와 거의 동일합니다 (True) in [True, False]. 괄호는 아무것도하지 않습니다. 바인딩을보다 빡빡하게하려면 전체 표현식 주위에 괄호를 넣어야합니다. 즉 연산자와 피연산자 모두를 의미합니다.(not True) in [True, False] . .

다른 방법으로 보려면

>>> -2**2
-4

** 보다 단단히 묶다 - 음수 2의 제곱이 아닌 양의 제곱을 얻습니다 (양수 4).

음수 2의 제곱을 원한다면 어떻게해야합니까? 분명히 괄호를 추가하십시오.

>>> (-2)**2
4

그러나 다음을 제공하는 것이 합리적이지 않습니다. 4

>>> -(2)**2
-4

-(2)와 동일 하기 때문 입니다 -2. 괄호는 절대 아무것도하지 않습니다. not(True)정확히 동일합니다.

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