아래 두 코드는 다른 결과값을 가진다는 사실, 알고 계셨습니까?
N, M = list(map(int, input().split()))
print(N, M)
N, M = [map(int, input().split())]
print(N, M)
이 두 표현식은 비슷해 보이지만 중요한 차이점이 있습니다. 애당초 실행 결과도 다르기에 실행 결과부터 확인해 보고 설명으로 넘어가겠습니다.
위 코드의 실행값입니다.
2 4
아래 코드의 실행값입니다.
ValueError: not enough values to unpack (expected 2, got 1)
두 코드의 실행값이 다르다는 것을 확인할 수 있습니다. 그럼 왜 이런 결과가 나오는지 살펴보겠습니다.
N, M = list(map(int, input().split()))
print(N, M)
이 표현식은 일반적으로 사용되는 올바른 방법입니다.
- input().split()은 입력된 문자열을 공백을 기준으로 나누어 문자열 리스트를 생성합니다.
- 사용자가 "10 20"을 입력하면 input().split()이 ['10', '20']을 반환합니다.
- map(int, ...)은 앞에서 생성된 문자열 리스트의 각 요소에 대해 int 함수를 적용하여 정수로 변환하는 단일 map 객체를 생성합니다.
- list(...)은 map 객체의 모든 요소를 평가하여 정수 리스트를 생성합니다.
- 이때 만들어지는 리스트는 [10, 20]입니다.
- 마지막으로, 언패킹 과정에서 N과 M에 각각 10과 20이 할당됩니다.
N, M = [map(int, input().split())]
print(N, M)
반면 이 표현식은 문법적으로는 올바르지만, 의도한 대로 작동하지 않습니다.
- map(int, input().split())은 map 객체를 생성하며, 여기까지는 앞의 코드와 동일합니다.
- 이 map 객체를 []로 감싸면 단일 요소를 가진 리스트가 생성됩니다.
- 'N, M = ' 부분에서 언패킹이 일어나지만 리스트에는 하나의 요소(map 객체)만 있습니다.
- 결과적으로 N에는 전체 map 객체가 할당되며, M에는 값이 할당되지 않아 ValueError가 발생합니다.
참고로 그렇다고 첫 번째 코드를 사용하는 건 추천하지 않습니다. 아래의 코드가 훨씬 좋습니다.
N, M = map(int, input().split())
일단 이 코드의 장점을 설명드리겠습니다.
- 코드 간결성
- 이 표현식은 한 줄로 두 개의 정수를 직접 변수에 할당합니다.
- map 객체에서 첫 번째와 두 번째 요소를 직접 언패킹 하여 N과 M에 할당합니다.
- 메모리 효율성
- list를 사용하면 map 객체의 모든 요소를 한 번에 메모리에 저장해야 하므로 추가적인 메모리를 사용하게 됩니다.
- 이 코드는 중간 리스트 생성 없이 필요한 값만 처리합니다.
- 성능
- map() 함수는 C로 구현되어 있어 일반적인 Python for 루프보다 더 빠르게 실행됩니다. 따라서 N, M = map(int, input().split())는 성능 면에서도 더 유리합니다.
- 리스트로 변환하는 과정이 없기 때문에 불필요한 오버헤드가 줄어듭니다.
이런 이유로 일반적으로 두 개 이상의 값을 입력받을 때는 그냥 이 코드를 사용하는 것이 권장됩니다.
# 이 글의 내용 중 일부는 Perplexity AI의 도움을 받아 정보를 수집하고 정리하였으며, 추가적인 연구와 개인적인 견해를 더하였습니다.
'파이썬 관련 문법' 카테고리의 다른 글
Counter 클래스: 코딩 테스트를 위한 효율적인 요소 빈도 계산 도구 (1) | 2024.12.11 |
---|---|
이진 탐색이란 무엇인가? (0) | 2024.12.10 |
파이썬의 구조분해 할당: 코드를 간결하고 강력하게 (0) | 2024.12.10 |
불변성이 가져오는 이점: 파이썬 튜플의 효율적인 메모리 관리 (0) | 2024.12.10 |
코드를 간단하게 만드는 법: 파이썬 람다(lambda) 함수 (0) | 2024.12.09 |