'None is None is None'이 True를 반환하는 이유는 무엇입니까?
이 질문에 이미 답변이 있습니다.
오늘 인터뷰에서 CTO는 어떤 것이 쉬운 질문인지 물었습니다.
이 관련된 것은 무엇을 반환합니까? :
None is None is None
문자는 첫 번째 작업을 실행 생각 None is None
하고 반환합니다 True
. 후 그 True is None
어느 것이 False
. 하지만 놀랍게도 정답은 True
입니다. 이 질문에 대한 답을 보내 고고하는데 이틀 동안 검색 한 결과 아무것도 찾지 않습니다. 어떤 누군가가 이런 일이 발생하는지 설명 할 수 있습니까?
바이트 코드는 두 가지 비교가 여기에서 수행되고 중간이 복제 보여줍니다.
>>> import dis
>>> def a():
... return None is None is None
...
>>> dis.dis(a)
2 0 LOAD_CONST 0 (None)
3 LOAD_CONST 0 (None)
6 DUP_TOP
7 ROT_THREE
8 COMPARE_OP 8 (is)
11 JUMP_IF_FALSE_OR_POP 21
14 LOAD_CONST 0 (None)
17 COMPARE_OP 8 (is)
20 RETURN_VALUE
>> 21 ROT_TWO
22 POP_TOP
23 RETURN_VALUE
비교 를 위해 문서 에서 언급했듯이 당시의 연산자가 함께 연결되기 때문입니다.
a op b op c
로 번역 할 것이다 a op b and b op c
(참고는 b
위의 그림과 같이 바이트 코드에)
일부 사람들이 언급했듯이 Python 비교는 연결될 수 있습니다 .
설명을 위해 연결시 Python은 실제로 활용을 AND 합니다.
T 그는이 뒤에 이론적 근거는 , 표현이 파운더 그입니다 a < b < c
수학 종래 해석이있다. 따라서 특정 표현의 혼란 스러운 존재가 참여하고 있습니다.None is None is None
따라서 기본적으로 다음과 같이 번역됩니다.
(None is None) and (None is None)
그것은 분명히 True
다음은 Python 문서의 또 다른 예입니다.
추가 정보
특히 이것은 인터뷰 질문이기 때문에 모든 언어가 공통적으로 공유하는 행동이 아니라는 점에 유의하는 것이 중요합니다.
내가 링크 한 문서에 있고 같이,
C와 달리 Python의 모든 연산은 연산은 동일한 우선 순위를 모든 연산, 이는 산술, 시프트 또는 비트 연산의 우선 순위보다 낮습니다.
따라서 10 > x > 2
표현식을 고려해 봅시다 ( is
연산자는 C 유효하지 않기에서 때문 입니다).
C의 번역 ( 연산자 우선 순위 때문에 )
((10 > x) > 2)
언어의 번역
(10 > x) and (x > 2)
is
문서에서 볼 수 비교 연산자입니다 .
comparison ::= or_expr ( comp_operator or_expr )* comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "!=" | "is" ["not"] | ["not"] "in"
따라서 다른 비교 연산자와 비교할 수 있습니다. 그래서
a = b = c = None
a is b is c
다음과 같다
(a is b) and (b is c)
참조 URL : https://stackoverflow.com/questions/50951076/why-does-none-is-none-is-none-return-true
'ProgramingTip' 카테고리의 다른 글
하나 워커 : 누락 된 dll (0) | 2020.12.30 |
---|---|
ansible 플레이 북 파일에 ssh 키 지정 (0) | 2020.12.30 |
cmd.exe를 사용할 때 따옴표를 어떻게 처리합니까? (0) | 2020.12.30 |
UI의 무단 작업을 숨기거나 수행해야합니까? 아니면 오류가 발생합니까? (0) | 2020.12.30 |
Maven은 SSH를 사용하여 로컬 파일을 원격 서버에 복사합니다. (0) | 2020.12.30 |