하얀설표 블로그




예제)파이썬 if문에서 True와 Flase 중 중요한 것은?(python if bollean variable)





( 수정됨)


미리보는 결론

파이썬 if문에서 기준이 되는 것은 False이다.

설명

if True:
    print(True)
else:
    print(False)
if Flase:
    print(Flase)
else:
    print(True)

파이썬으로 코드를 작성하다보면 if문을 사용할 때가 많다.
if문은 단어 그대로 "만약에 ~"이기 때문에 Bool 객체인 True와 False를 기준으로 한다.

이런 생각에 if문은 참과 거짓, 두 가지를 기준으로 한다는 이분법적인 사고를 하기 쉽다.

if문은 True와 False만 사용할 수 있을까?

당연하지만 답은 "아니오"다.
다음과 같이 boolean 객체가 아닌 값들도 if문에 사용할 수 있다.

if 1:
    print(True)
else:
    print(Flase)
>> True
if '1':
    print(True)
else:
    print(Flase)
if [1]:
    print(True)
else:
    print(Flase)

if not variable

다음과 같이 if not {변수}로 False를 대체하는 것도 가능하다.

if not 0:
    print(False)
else:
    print(True)
>> Flase
if not '':
    print(False)
else:
    print(True)
>> Flase
if not []:
    print(False)
else:
    print(True)
>> Flase
if not {}:
    print(False)
else:
    print(True)
>> Flase

그런데.. 별 생각없이 무심코 사용한 if variable, if not variable은 뜻밖의 참사를 불러오게 되는 원인이 된다.

if variable로 인해 발생하는 참사

d = {'1': 0, '2': 0, '3': 3, '4': 4}
l = [1, 2, 3, 4, '1', '2', '3', '4']
r = []
for i in l:
    if d.get(i):
        r.append(d[i] * 3)
    else:
        r.append(None)
print(f'{r=}')
>> r=[None, None, None, None, None, None, 9, 12]

위 코드는 리스트 l의 요소들 중 딕셔너리 d의 키가 되는 것이 있다면 d의 값에 3을 곱한 값을 리스트 r에 append하고,
없다면 None을 append하는 코드다.

그러나 결과는 4개가 아닌 6개의 None이 들어있는 리스트였다.

문제의 원인은 '1'과 '2'의 값이 0이었기 때문인데, if 0과 if None은 False와 같기 때문에 else문이 작동된 것이다.
제대로 된 결과를 얻기 위해서는 다음과 같이 d.get(i) is None을 조건으로 설정해야 한다.

d = {'1': 0, '2': 0, '3': 3, '4': 4}
l = [1, 2, 3, 4, '1', '2', '3', '4']
r = []
for i in l:
    if d.get(i) is None:
        r.append(None)
    else:
        r.append(d[i] * 3)
print(f'{r=}')
>> r=[None, None, None, None, 0, 0, 9, 12]

이처럼 무심코 생각한 if문의 조건이 생각한 것과 다른 결과를 가져오게 되는 경우가 은근히 많았다.
자잘한 실수로 제대로 된 결과를 얻지 못하는 경우가 생각보다 많아서 코드를 짜는 것보다 이런 부분들을 하나하나 살펴보고 찾아내는게 너무 어렵다..


공감 : 0







white.seolpyo.com