"[False, True]의 not (True)"이 False를 반환하는 이유는 무엇입니까?
내가 이렇게하면 :
>>> False in [False, True]
True
반환합니다 True
. 단순히 False
목록에 있기 때문 입니다.
그러나 내가하면 :
>>> not(True) in [False, True]
False
반환합니다 False
. 반면 not(True)
에 False
:
>>> not(True)
False
왜?
연산자 우선 순위 2.X , 3.X . 의 우선 순위가의 우선 순위보다 not
낮습니다 in
. 따라서 다음과 같습니다.
>>> not ((True) in [False, True])
False
이것은 당신이 원하는 것입니다 :
>>> (not True) in [False, True]
True
@ 벤이 지적 하듯이 : 그것은 쓰기 결코에게 권장 not(True)
선호하지 않습니다 not True
. 전자는 함수 호출처럼 보이지만 함수 not
는 아닌 연산자입니다.
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
운영자 우선 순위. in
보다 더 긴밀하게 바인딩 not
되므로 표현식이와 동일합니다 not((True) in [False, True])
.
그것은 모든 약의 연산자 우선 순위 ( in
보다 강 not
). 그러나 올바른 위치에 괄호를 추가하면 쉽게 수정할 수 있습니다.
(not(True)) in [False, True] # prints true
쓰기:
not(True) in [False, True]
같은 것입니다 :
not((True) in [False, True])
이 True
목록에 있는지 확인 하고 결과의 "not"을 반환합니다.
그것은으로 평가하고 not True in [False, True]
있는 반환 False
하기 때문 True
이다[False, True]
당신이 시도하면
>>>(not(True)) in [False, True]
True
예상 결과를 얻습니다.
우선 순위 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
컬렉션 포함 확인 작업으로 보자 : [False, True]
일부 요소가 포함 된 목록입니다.
표현식 True in [False, True]
은 목록에 포함 된 요소 True
와 같이를 반환 True
합니다.
따라서 연산자 보다 우선 순위가 높으므로 우선 순위를 유지하기 위해 괄호없이 위의 표현식의 결과로 not True in [False, True]
"부울 반대"를 제공합니다 . 따라서 결과가 발생 합니다.not
in
not
not True
False
한편, (not True) in [False, True]
동일하다 False in [False, True]
된다 True
( False
리스트에 포함된다).
다른 답변 중 일부를 명확히하기 위해 단항 연산자 뒤에 괄호 를 추가 해도 우선 순위가 변경되지 않습니다. not(True)
에 not
더 밀접하게 바인딩 하지 않습니다 True
. 주위에 중복 된 괄호 세트입니다 True
. 와 거의 동일합니다 (True) in [True, False]
. 괄호는 아무것도하지 않습니다. 바인딩을보다 빡빡하게하려면 전체 표현식 주위에 괄호를 붙여야합니다 (not True) in [True, False]
. 즉 연산자와 피연산자 모두를 의미합니다 .
이것을 다른 방법으로 보려면
>>> -2**2
-4
**
보다 단단히 묶기 때문에 -
음수 2의 제곱 (양수 4)이 아닌 2 제곱의 음수가됩니다.
음수 2의 제곱을 원한다면 어떻게해야합니까? 분명히 괄호를 추가하십시오.
>>> (-2)**2
4
그러나 다음을 제공하는 것이 합리적이지 않습니다. 4
>>> -(2)**2
-4
-(2)
와 동일 하기 때문 입니다 -2
. 괄호는 절대 아무것도하지 않습니다. not(True)
정확히 동일합니다.
다음 은 운영자 우선 순위에 대한 문서입니다.
in binds tighter than not
그렇게하는 것은 목적에 도움이 될 것입니다
>>> (not True) in [False, True]
True
참고 URL : https://stackoverflow.com/questions/31421379/why-does-nottrue-in-false-true-return-false
'development' 카테고리의 다른 글
Node.js에서 스택 추적을 인쇄하는 방법은 무엇입니까? (0) | 2020.02.14 |
---|---|
Visual Studio“Any CPU”대상은 무엇을 의미합니까? (0) | 2020.02.14 |
ArithmeticException :“비 종료 소수점 확장; (0) | 2020.02.14 |
LINQ를 사용하여 하나의 List <>에서 다른 List <>에없는 항목을 가져옵니다. (0) | 2020.02.14 |
개체가 비어 있습니까? (0) | 2020.02.14 |