불(Boolean) 을 나타내는 참(True), 거짓(False). 파이썬에서는 논리 연산자와 비교 연산자의 판단 결과로 True, False 를 사용한다.
Ture
, False
또한 1, 3, 7, 'test'
처럼 일종의 '값'이다.
>>> 'Python' == 'Python'
True
>>> 'Python' == 'python'
False
>>> 'Python' != 'python'
True
is
, is not
)>>> 1 == 1.0
True
>>> 1 is 1.0
False
>>> 1 is not 1.0
True
이번에는 is
, is not
에 대해 살펴보자. 이미 ==
과 !=
가 있는데 왜 is
, is not
를 만들었을까?
==
과 !=
는 값 자체를 비교하지만 is
, is not
는 객체(object) 를 비교한다. 이에 대한 얘기는 나중에..
1 과 1.0은 정수와 실수라는 차이점이 있지만 값 자체는 같다 따라서 ==
는 Ture
이지만 is
는 False
이다. 왜냐하면 1은 정수 객체이고 1.0은 실수 객체이기 때문이다.
실제로 정수 객체와 실수 객체가 서로 다른지 확인하기 위해서는 id
라는 함수를 사용하면 된다. id
는 객체의 고유한 값(메모리 주소)를 구한다. (이 값은 파이썬이 실행되는 동안은 계속 유지되지만 다시 실행하면 값이 바뀔 수 있다.)
>>> id(1)
1714767504
>>> id(1.0)
55320032
is
사용하지 말기값을 비교할 때는 is
를 사용하면 안된다.
>>> a = -5
>>> a is -5
True
>>> a = -6
>>> a is -6
False
위의 경우를 보면 처음에 변수 a
에 -5
를 할당한 다음에 is
를 통해 확인해보면 True
가 나오지만 다시 -6
을 할당한 뒤에 is
를 통해 확인해보면 False
가 나온다.
그 이유는 변수 a
가 이미 있는 상태에서 다른 값을 할당하면 메모리 주소값이 바뀔 수 있기 때문이다. 따라서 다른 객체가 되므로 값이 같더라고 is
를 통한 비교는 하지 않는 것이 좋다.
논리 연산자에는 and
, or
, not
이 있다.
-and
>>> True and True
True
>>> True and False
False
>>> False and True
False
>>> False and False
False
>>>
-or
>>> True or True
True
>>> True or False
True
>>> False or True
True
>>> False or False
False
-not
>>> not True
False
>>> not False
True
and
, or
, not
가 식 하나에 들어가 있으면 not
, and
, or
순서대로 해석한다.
>>> not True and False or not False
True
위 예제를 보면 먼저 not True
와 뒤에 있는 not False
를 먼저 해석하여 False and False or Ture
가 되고 그 다음에 and
를 해석하여 False or Ture
만 남게 된다. 마지막으로 or
를 해석하여 최종적으로 Ture
가 되는 것이다.
>>> 10 == 10 and 10 != 5 # True and True
True
>>> 10 > 5 or 10 < 3 # True or False
True
>>> not 10 > 5 # not True
False
>>> not 1 is 1.0 # not False
True
논리 연산자와 비교 연산자가 같이 사용되는 형태를 많이 보았을 것이다. 이럴 때에는 비교 연산자를 먼저 판단하고 난 뒤에 논리 연산자를 판단하면 된다. (각 연산자의 판단 순서는 다음 을 참고)
정수, 실수, 문자열을 불로 만들 때에는 bool
을 사용하면 된다. 이때 정수는 0, 실수는 0.0 이외의 모든 숫자는 Ture
이다. 문자열은 ''
나 ""
를 와 같은 빈문자열을 제외한 모든 문자열은 Ture
가 된다.
>>> bool(1)
True
>>> bool(0)
False
>>> bool(1.5)
True
>>> bool('False')
True
논리 연산에서 중요한 부분이 단락 평가이다. 단락 평가는 첫 번째 값으로만으로도 결과가 확실해지면 두 번째 값은 확인하지 않는 것을 말한다. 예를 들어서 and
의 경우 첫 번째 값이 False
이면 뒤에 어떤 값이 오든지 False
이기 때문에 바로 거짓으로 결정하는 것이다. 비슷하게 or
의 경우 첫 번째 값이 True
이면 뒤에 어떤 값이 오든지 Ture
이기 때문에 참으로 결정하는 것이다.
특히 파이썬에서 논리 연산자는 이 단락 평가에 따라 반환 값이 정해진다. 앞서 우리는 논리 연산을 Ture and False
과 같이 했을 때는 False
가 나왔다. 그런데 만약에 True and 'Python'
를 하면 어떻게 나올까?
>>> True and 'Python'
'Python'
True
가 나올줄 알았지만 특이하게 'Python' 이 나왔다. 왜냐하면 파이썬에서는 논리 연산자는 마지막 단락 평가를 실시했던 값을 그대로 반환하기 때문이다. 따라서 논리 연산자는 반드시 불을 리턴하지 않는다.
그렇다면 아래의 예제의 반환값을 이해하는데 큰 무리가 없을 것이다.
>>> True or 'Python'
True
>>> 'Python' or True
'Python'
>>> False or 'Python'
'Python'
>>> 0 or False
False