“[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 True즉False .

중앙 객체가 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.