Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬이 리스트 대신 튜플의 리스트를 반환하는 이유는 무엇일까?

파이썬으로 데이터베이스를 다뤄본 개발자라면 한 번쯤 궁금해했을 것입니다. 쿼리 결과를 조회하면 왜 익숙한 리스트(list)가 아니라 튜플(tuple)의 리스트로 반환될까요? 이는 단순한 구현상의 선택이 아니라, 파이썬의 설계 철학과 깊은 관련이 있습니다.

1. 데이터 불변성(Immutability)에 대한 약속

핵심 이유는 불변성입니다. 파이썬은 함수나 라이브러리가 데이터를 반환할 때, 호출자가 해당 데이터를 수정하지 않고 그대로 사용하기를 기대합니다. 튜플은 생성 후 값을 변경할 수 없는(immutable) 자료구조이기 때문에, 반환된 데이터가 의도치 않게 변형되는 것을 원천적으로 방지합니다.

반면 리스트는 언제든 요소를 추가, 삭제, 수정할 수 있는 가변(mutable) 자료구조입니다. 따라서 '읽기 전용'으로 제공해야 하는 데이터에는 튜플이 더 적합합니다.

2. 성능상의 이점

튜플은 리스트보다 메모리 사용량이 적고 처리 속도도 빠릅니다. 리스트는 크기가 변경될 수 있어야 하므로 여유 메모리를 미리 확보해 두지만, 튜플은 고정된 크기로 최적화되어 있습니다. 대량의 데이터를 다루는 데이터베이스 작업에서는 이러한 차이가 누적되어 유의미한 성능 향상으로 이어집니다.

3. 순서와 위치의 의미

튜플은 일반적으로 순서와 위치가 의미 있고 일관성 있게 유지되어야 하는 데이터에 사용됩니다. 데이터베이스 쿼리 결과의 각 행(row)은 SELECT 문에 명시한 필드 순서와 정확히 일치해야 하기 때문입니다.

예를 들어 다음과 같은 쿼리를 실행했다고 가정해 보겠습니다.

SELECT name, email, age FROM users;

이 경우 반환되는 각 튜플은 항상 (name, email, age) 순서를 유지합니다. 튜플의 불변성 덕분에 이 순서가 실수로 변경될 위험이 없으며, 인덱스로 값에 접근할 때 안정성이 보장됩니다.

4. 데이터베이스 드라이버의 설계 의도

실제로 psycopg2, mysql-connector-python 같은 파이썬 데이터베이스 드라이버들은 쿼리 결과를 튜플의 리스트 형태로 반환합니다. 이는 드라이버가 사용자에게 '데이터를 가져다 사용하라'는 의도를 담은 것이지, '데이터를 수정하라'는 것이 아니기 때문입니다.

만약 수정 가능한 자료구조가 필요하다면, 다음과 같이 간단하게 리스트로 변환할 수 있습니다.

rows = cursor.fetchall()
rows_as_lists = [list(row) for row in rows]

또는 딕셔너리 커서(DictCursor)를 활용하면 필드 이름으로 값에 접근할 수 있어 코드의 가독성을 더욱 높일 수 있습니다.

정리

파이썬이 튜플의 리스트를 반환하는 이유를 정리하면 다음과 같습니다.

  • 불변성 보장: 반환된 데이터가 의도치 않게 수정되는 것을 방지
  • 성능 최적화: 리스트보다 적은 메모리와 빠른 처리 속도
  • 순서 보장: 쿼리한 필드 순서와 동일한 구조 유지
  • 명확한 의도 전달: 데이터는 '사용'하는 것이지 '변경'하는 것이 아님

결국 튜플은 단순한 문법적 선택이 아니라, 데이터의 무결성과 안정성을 지키기 위한 파이썬의 설계 철학이 반영된 결과입니다.