False == 0 및 True == 1은 구현 세부 정보입니까, 아니면 언어에 의해 보장됩니까?


245

False == 0그리고 True == 1파이썬에서 (사용자가 다시 할당하지 않았다고 가정) 보장 됩니까? 예를 들어, 다음 코드가 Python 버전 (기존 및 향후 버전 모두)에 관계없이 항상 동일한 결과를 생성한다고 보장합니까?

0 == False  # True
1 == True   # True
['zero', 'one'][False]  # is 'zero'

공식 문서에 대한 언급은 대단히 감사하겠습니다!

편집 : 많은 답변에서 언급했듯이에서 bool상속 int합니다. "문서가 공식적 프로그래머, 정수에서 상속 논리 값에 의존 수 있다고합니까 : 질문 그러므로로 개주 수 의 값으로 0하고1 ?". 이 질문은 구현 세부 사항으로 인해 실패하지 않는 강력한 코드 작성과 관련이 있습니다!


63
@ S.Lott : 위의 질문을하는 데는 여러 가지 이유가 있습니다. 따라서 부울을 정수로 사용하면 코드가 더 단순 해지는 경우가 있습니다. 변경해야합니까? 또는 부울을 정수로 사용하는 다른 사람이 작성한 코드에서 장소를 발견 할 수 있습니다. 기존 코드를 "수정"하기 위해 코드에서 수정중인 사항을 중단합니까, 아니면 현재 코드가 건전하다는 것을 확신 할 수 있습니까 ? 많은 다른 예가 있습니다. 더 일반적으로, 게임 규칙을 아는 것이 좋으므로, 게임을 잘하고 건전한 방식으로 프로그래밍 할 수 있습니다.
Eric O Lebigot

10
@ S.Lott : 원래 게시물은 요점을 정확하게 반영합니다. 질문은 본질적으로 "구현 세부 사항입니까?"입니다. 구현 세부 사항에 의존해서는 안된다는 아이디어에 전적으로 동의하기 때문입니다. 부울이 공식적으로 알려진 값의 정수라면 질문의 코드는 구현 세부 사항에 의존하지 않으므로 좋습니다.
Eric O Lebigot

5
@에스. 로트 : False == 0 및 True == 1이라는 것을 알고 있으면 시퀀스에서 얼마나 많은 부울이 참인지 쉽게 계산할 수 있습니다. 그냥 쓸 수 있습니다 sum(bool_list). 그렇지 않으면을 작성해야합니다 sum(1 for x bool_list if x).
dan04

8
@ dan : 그것은 부울을 계산하는 한 가지 방법입니다. 나는 그것이 bool_list.count(True)더 명백 하다고 말할 것이다 . 그것은 또한 약 3 배 더 빠릅니다… :)
Eric O Lebigot

2
@akonsu 답변에서 알 수 있듯이 파이썬 부울 실제로 (특정 서브 클래스) 정수입니다. 게다가 파이썬 에는 분명히 유형 있습니다. 어쩌면 "정적으로 유형이 지정되지 않았다"는 의미입니까? 또한 "코드에 오류가 발생하지 않습니다"라는 것이 무슨 의미인지 잘 모르겠습니다. 부울을 정수와 혼합하는 것을 좋아하지 않습니다. 부울은 개념적으로 다르기 때문에 파이썬 부울이 정수가 아닌지 여부는 신경 쓰지 않지만 값이 0과 1 인 것을 알면 유용합니다.
Eric O Lebigot 3

답변:


184

Python 2.x에서는 이것이 가능 하고 재 할당 될 수 있으므로 보장 되지 않습니다 . 그러나이 경우에도 비교를 위해 부울 True 및 부울 False가 올바르게 리턴됩니다.TrueFalse

Python 3.x에서 TrueFalse키워드이며 항상 1and 0입니다.

Python 2의 일반적인 상황에서 항상 Python 3의 경우 :

Falseobject의 유형 bool은 다음과 같은 하위 클래스입니다 int.

object
   |
 int
   |
 bool

귀하의 예에서 ['zero', 'one'][False]작동 하는 유일한 이유 입니다. 목록 인덱싱은 정수 또는 __index__메소드 를 정의하는 객체 ( mark-dickinson ) 에서만 작동하기 때문에 정수의 서브 클래스가 아닌 객체에서는 작동하지 않습니다 .

편집하다:

현재 파이썬 버전과 파이썬 3도 마찬가지입니다. 파이썬 2.6 문서와 파이썬 3 문서는 다음 과 같이 말합니다.

정수에는 두 가지 유형이 있습니다. [...] 정수 (int) [...] 부울 (bool)

부울 하위 섹션에서 :

부울 :이 값은 진리 값 False 및 True [...]를 나타냅니다. 부울 값은 거의 모든 컨텍스트에서 각각 값 0과 1처럼 동작합니다. 예외는 문자열로 변환 할 때 문자열 "False"또는 "True입니다. "가 각각 반환됩니다.

도 있습니다 파이썬 2 :

숫자 컨텍스트 (예 : 산술 연산자의 인수로 사용되는 경우)에서 [False 및 True]는 각각 정수 0과 1처럼 동작합니다.

따라서 부울은 Python 2.6 및 3에서 명시 적으로 정수로 간주됩니다.

따라서 Python 4가 나올 때까지 안전합니다. ;-)


2
0 == 0.0은 [ 'zero', 'one'] [0.0]이 실패하는 동안 True를 반환합니다. bool은 int의 하위 클래스이므로 [ 'zero', 'one'] [False]가 작동합니다. (int .__ subclasses __ ()는 [<type 'bool'>]을 반환합니다)
luc

20
Nitpick : __index__메서드 를 제공하는 모든 개체를 목록 인덱스로 사용할 수 있습니다. int또는의 서브 클래스 만이 아닙니다 long.
Mark Dickinson

아 네, 저기 있어요. 그러나 파이썬 3.0 문서에 링크하지 않는 것이 좋습니다 : 3.0은 죽었습니다. :)
Mark Dickinson

4
Re : "Python 2.x에서는 True와 False를 다시 할당 할 수 있으므로 이것이 보장되지 않습니다." IMHO, 이것이 사실이지만 True 또는 False를 재 할당하는 사람은 자신이 얻는 이상한 결과를받을 자격이 있습니다. 특히 재 할당 전에 True를 저장 한 다음 재 할당 후 True와 결과를 비교하면 문제가 발생합니다. a = True; True = 'i am an idiot'; a == True=> 거짓. 이러한 재 할당 이외의 기본값은 0과 1로 표준화되어 있으며 이에 의존하는 것이 일반적입니다. 예를 들어, [0]이 거짓 인 경우, [1] true 인 2 요소 배열로 색인을 생성합니다.
ToolmakerSteve

방금 True가 실제로 1 및 False 0으로 간주 될 수 있다는 사실에 대한 또 다른 공식적인 확인을 보았습니다 : docs.python.org/2/library/stdtypes.html#boolean-values . 이 답변에 이것을 추가하고 있습니다.
Eric O Lebigot

78

: 파이썬 2.3의 새로운 부울 유형 논의 PEP 링크 http://www.python.org/dev/peps/pep-0285/을 .

부울을 정수로 변환 할 때 정수 값은 항상 0 또는 1이지만 정수를 부울로 변환 할 때 부울 값은 0을 제외한 모든 정수에 대해 True입니다.

>>> int(False)
0
>>> int(True)
1
>>> bool(5)
True
>>> bool(-5)
True
>>> bool(0)
False

22

Python 2.x에서는 전혀 보장되지 않습니다.

>>> False = 5
>>> 0 == False
False

따라서 변경 될 수 있습니다. Python 3.x에서 True, False 및 None은 예약어입니다. 이므로 위의 코드는 작동하지 않습니다.

일반적으로 부울을 사용하면 False는 항상 0의 정수 값을 가지지 만 (위와 같이 변경하지 않는 한) True는 다른 값을 가질 수 있다고 가정해야합니다. 필자는 반드시 보장 True==1하지는 않지만 Python 3.x에서는 이것이 무엇이든 항상 그렇습니다.


3
"True는 다른 값을 가질 수 있습니다. 반드시 True == 1이라는 보장에 의존 할 필요는 없습니다." 실제로 python.org/dev/peps/pep-0285 및 spec docs.python.org/2/reference/…에 따라 True == 1을 사용할 수 있습니다. "부울 값은 각각 0과 1의 값처럼 동작합니다 , 거의 모든 상황에서 ... "나는 Py 2에서 True 또는 False를 다시 할당하여 이것을 재정의하는 것이 불가능하다고 말하지는 않지만 프로젝트의 일부 프로그래머가 바보가 아니며 그러한 재 할당을하지 않으면 행동이 보장됩니다.
ToolmakerSteve

-2

매우 간단합니다. bool은 정수를 bool로 평가하는 것과 관련이 있으므로 0 만 오답입니다. 음수가 아닌 모든 제로 이외의 값, 부동 소수점, 정수 또는 무엇을 가지고 있는지는 true를 반환합니다.

이것이 유용한 이유의 좋은 예는 장치의 전원 상태를 결정하는 것입니다. On은 0이 아닌 값이고 off는 0입니다. 전자적으로 말하면 이것이 의미가 있습니다.

값 사이에서 상대적으로 참 또는 거짓을 결정하려면 비교할 무언가가 있어야합니다. 이는 ==또는 !=또는 <,을 사용하여 문자열 및 숫자 값에 적용됩니다 > >=.<=

변수에 정수를 할당 한 다음 해당 변수 값에 따라 true 또는 false를 얻을 수 있습니다.


1
문제는 정수의 부울 값이 아니라 Python이 True == 1을 보장하는지에 관한 것입니다.
Eric O Lebigot

-3

그냥 쓰기 int(False)당신은 얻을 것이다 0당신이 입력하면, int(True)출력 것을1


4
이는 False와 True가 int()0과 1과 정확히 동일하지 않다는 단순한 숫자 의미 로 유효한 입력 이라는 것을 의미합니다.
Eric O Lebigot

-5

거짓은 바보입니다. 유형이 다릅니다. 정수인 0과 다른 오브젝트입니다.

0 == FalseFalse가 정수로 캐스트되므로 True를 리턴합니다. int (False)는 0을 반환합니다

== 연산자의 파이썬 문서는 (help ( '=='))라고 말합니다.

연산자는 <, >, ==, >=, <=, 및 !=두 개체의 값을 비교합니다. 객체의 유형이 같을 필요는 없습니다. 둘 다 숫자 인 경우 공통 유형으로 변환됩니다.

결과적으로 False는 비교가 필요한 정수로 변환됩니다. 그러나 0과 다릅니다.

>>> 0 is False
False

26
이것은 옳지 않습니다 : bool의 하위 클래스 int이므로 매우 실제적으로 bool 정수입니다. 예를 들어 isinstance(True, int)True를 반환합니다. 그리고 평등 검사는 변환이 필요하지 않기 때문에 bool을 int로 변환하지 않습니다 int.__cmp__. 단순히 직접 호출 합니다. 참고 bool.__cmp__ is int.__cmp__도를 평가한다 True.
Mark Dickinson

3
이 답변에 -1입니다. bool과 int의 관계에 대한 잘못된 설명 (Python 2). isinstance(True, int)=> 맞습니다. 즉, True 정수이며 변환이 필요하지 않습니다.
ToolmakerSteve

나는 False 또는 Int를 반환하는 스크립트를 사용 while response is False했다 while response == False.
curly_brackets

5
그것은 0 is False거짓이 당신에게 아무 것도 말하지 않습니다. 대화 형 인터프리터에서 입력 x = -10한 후 y = -10, 다음 x is y및 그 것 또한 거짓. 파이썬 인터프리터가 특정 환경에서 동일한 정수 객체를 재사용하는 최적화가 있기 때문에 (정수 리터럴을 상수로 저장하고 작은 정수를 저장하는) is정수 평등 을 테스트하려는 경우 사용해야 하는 것은 아닙니다 .
Martijn Pieters
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.