내가 예상대로 true/false에 할당이 작동하지 않는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/2055029

  •  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)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top