내가 예상대로 true/false에 할당이 작동하지 않는 이유는 무엇입니까?
-
20-09-2019 - |
문제
또 다른 질문에 대답하는 일의 일환으로, 나는 언뜻보기에 그 행동이 기괴한 다음 코드를 썼습니다.
print True # outputs true
True = False; print True # outputs false
True = True; print True # outputs false
True = not True; print True # outputs true
누구 든지이 이상한 행동을 설명 할 수 있습니까? 나는 그것이 Python의 객체 모델과 관련이 있다고 생각하지만 확실하지 않습니다.
Cygwin의 버전 2.5.2입니다.
해결책
파이썬에는이 두 가지 (다른) 내장 된 물체가 있습니다. 그들은 단지 대상 일뿐입니다. 처음에는 아직 이름이 없지만 우리가 언급 한 것을 알기 위해서는 0x600D
그리고 0xBAD
.
Python (2.x) 스크립트를 실행하기 전에 이름 True
물체에 묶여 있습니다 0x600D
, 그리고 이름 False
물체에 묶여 있습니다 0xBAD
, 프로그램이 참조 할 때 True
, 그것은 봅니다 0x600D
.
왜냐하면 0x600D
그리고 0xBAD
그것들은 일반적으로 이름으로 사용된다는 것을 알고 있습니다 True
그리고 False
, 그것이 그들이 인쇄 될 때 출력하는 것입니다. __str__
의 방법 0x600D
보고 'True'
등등.
True = False
이제 이름을 묶습니다 True
다른 대상으로. 이제부터 두 이름 모두 True
그리고 False
동일한 개체를 참조하십시오 0xBAD
, 인쇄 할 때 출력 False
.
True = True
실제로 아무것도하지 않습니다 : 그것은 이름으로 언급 된 개체를 취합니다. True
, 그리고 새 (그리고 오래된) 이름을 묶습니다 True
이 대상에. 이후 (이전 단계 때문에) True
~을 참고하여 0xBAD
이 전에는 여전히 언급됩니다 0xBAD
금후. 따라서 인쇄는 여전히 출력됩니다 False
.
True = not True
먼저 그 이름을 가진 대상을 취합니다 True
묶여 있습니다 0xBAD
. 그것은이 객체를 not
운영자. not
여기에 어떤 이름이 사용되는지 신경 쓰지 않거나 알지 못합니다. 0xBAD
, 그것은 단지 주어지면 그것을 알고 있습니다 0xBAD
돌아와야합니다 0x600D
. 그런 다음이 반환 값은 과제 연산자에게 제공됩니다. =
, 이름을 바인딩합니다 True
이 대상에.
이름 이후 True
이제 한 번 더 개체를 말합니다 0x600D
, 전화 print True
출력 True
, 그리고 세상은 다시 좋다.
다른 팁
대신 상상해보십시오.
A = True
B = False
print A # true
A = B; print A # false
A = A; print A # false, because A is still false from before
A = not A; print A # true, because A was false, so not A is true
똑같은 일이 계속되고 있지만, 당신의 버전에서는 당신이 진실과 거짓을 재정의 할 수 있다고 기대하지 않기 때문에 혼란 스럽습니다.
2.X에서는 true와 false가 키워드가 아니므로 이런 식으로 내장을 섀도우 할 수 있습니다.
True/False가 키워드인지 확인할 수 있습니다.
>>> import keyword
>>> keyword.iskeyword('True')
False
(내 버전에서)가 아니기 때문에 true = false는 "true"가 또 다른 "변수"이름임을 의미합니다.
간단한 부울 비교를 사용하여 원래 값을 쉽게 복원 할 수 있습니다.
True = 1==1
False = 1==0
또는 정수 리터럴을 부울로 변환하여 :
True = bool(1) # actually every number except 0 works
False = bool(0)