본문으로 바로가기
TaeyoungKim.dev

파이썬 딕셔너리 get()과 [] 차이: 없는 키는 KeyError일까 None일까?

파이썬작성 약 3분 읽기TaeyoungKim
LinkedInX

프로필에 city가 없는데 profile['city']를 읽자 프로그램이 멈췄다. get()으로 바꾸니 이번에는 오류 없이 None이 나왔다. 친절해 보이지만, 필수 정보가 빠져도 조용히 넘어갈 수 있다. 키가 없을 때 실패해야 하는지, 다른 값으로 계속할지부터 정해 보자.

딕셔너리 대괄호 조회는 왜 KeyError가 날까?

딕셔너리의 대괄호 안에는 리스트의 위치 번호가 아니라 키를 쓴다. 아래 프로필에는 name만 있다.

python
profile = {'name': 'Ada'}

print(profile['name'])
print(profile['city'])

첫 줄의 결과는 Ada다. 두 번째 조회는 존재하지 않는 city를 요구하므로 KeyError: 'city'가 난다. 오타도 같은 방식으로 드러난다. 반드시 있어야 하는 키라면 이 실패가 문제를 빨리 알려 주기도 한다.

dict.get()은 없는 키에서 무엇을 반환할까?

같은 프로필에 get()을 사용하면 키가 없을 때 예외 대신 None을 돌려준다. 두 번째 인자로 대체값도 지정할 수 있다. Python 공식 딕셔너리 설명도 대괄호 조회와 get()의 이 차이를 명시한다.

python
profile = {'name': 'Ada'}

print(profile.get('city'))
print(profile.get('city', '미입력'))
print(profile)
text
None
미입력
{'name': 'Ada'}

get()은 읽기만 하므로 city를 새로 저장하지 않는다. 그림은 같은 없는 키를 두 방식으로 조회한 결과다.

단, get()이 언제나 안전한 해결책은 아니다. profile.get('nmae')처럼 키 이름을 잘못 적어도 None이 나온다. 필수 필드를 읽는데 무조건 get()을 쓰면 실수와 정상적인 누락을 구별하기 어려워진다.

저장된 None과 아예 없는 키는 어떻게 구분할까?

이번에는 nickname 키가 있지만 값은 None인 프로필을 보자.

python
profile = {'name': 'Ada', 'nickname': None}

print(profile.get('nickname'))  # 키가 있고 값이 None
print(profile.get('city'))      # 키가 없음
print('nickname' in profile)
print('city' in profile)
text
None
None
True
False

get()의 반환값만 보면 두 경우가 똑같다. 존재 여부가 중요하면 키 in 딕셔너리로 먼저 확인하자. get('nickname', '미입력')도 저장된 값이 None이면 대체값이 아니라 None을 반환한다. 대체값은 키가 없을 때만 쓰인다.

실제 입력 처리에서는 필수 키와 선택 키를 나눠 두면 편하다. name처럼 반드시 있어야 하는 값은 존재 여부를 검사하거나 대괄호 조회의 실패를 처리한다. city처럼 빠져도 되는 값은 get('city', '미입력')으로 표시용 기본값을 둘 수 있다. 다만 키가 있는데 값만 None인 경우까지 같은 '미입력'으로 취급할지는 데이터 규칙에 따라 따로 정해야 한다.

핵심 요약

profile['city']는 키가 없으면 KeyError, profile.get('city')는 None을 반환한다. get(key, default)의 기본값은 없는 키에만 적용된다. None이 실제로 저장된 경우와 키가 없는 경우를 구별해야 한다면 반환값을 추측하지 말고 key in profile을 확인하자. 필수 값의 오타나 누락을 조용히 숨기지 않는 것도 중요하다.

작성자

TaeyoungKim

기초 개념을 구현과 검증, 실제 운영 판단까지 연결해 기록합니다.

#Python#파이썬 딕셔너리#dict.get#KeyError#None

함께 읽으면 좋은 글