정렬한 새 리스트가 필요하면 sorted(values)를, 기존 리스트 자체를 바꾸려면 values.sort()를 쓴다. list.sort()의 반환값은 정렬된 리스트가 아니라 None이다. result = values.sort()에서 result를 출력해 None이 나왔다면 이 반환값을 저장한 것이다.
새 정렬 결과를 받는 최소 예제
values = [3, 1, 2]
result = sorted(values)
print(result)
print(values)
print(result is values)
[1, 2, 3]
[3, 1, 2]
False
result는 새 리스트이고 입력 values의 순서는 그대로다. sorted는 리스트 외의 iterable도 받아 리스트를 반환한다. 입력 요소를 깊은 복사하는 함수는 아니다.
각 Python 코드 블록은 독립 실행할 수 있다. 예제는 CPython 3.14.3·Windows 11에서 확인했고 Python 3.14 공식 문서와 대조했다. 문서 사이트의 패치 판본은 실행한 인터프리터와 다를 수 있다.
원본을 정렬할 때는 호출과 사용을 나눈다
values = [3, 1, 2]
alias = values
returned = values.sort()
print(values)
print(returned)
print(alias is values)
print(alias)
[1, 2, 3]
None
True
[1, 2, 3]
원본을 바꾸는 목적이면 values.sort()를 호출한 뒤 values를 사용하면 된다. 반환값 None은 정렬 실패나 빈 결과를 뜻하지 않는다. alias도 같은 리스트를 가리키므로 바뀐 순서를 본다.
| 선택 기준 | sorted(values) | values.sort() |
|---|---|---|
| 반환값 | 새 리스트 | None |
| 리스트 입력의 순서 | 이 호출이 원본을 재배열하지 않음 | 같은 리스트를 재배열 |
| 사용할 결과 | 반환된 리스트 | 호출 뒤 원본 리스트 |
Python 정렬 안내와 list.sort 공식 문서에서 새 리스트·원본 변경·None 반환을 확인할 수 있다. 원본 순서를 계속 써야 하는지가 선택의 출발점이다.
정렬 키가 같을 때의 순서와 요소 공유
records = [
{"name": "나", "score": 2},
{"name": "가", "score": 1},
{"name": "다", "score": 2},
]
ranked = sorted(records, key=lambda row: row["score"])
print([row["name"] for row in ranked])
print(ranked[0] is records[1])
ranked[0]["score"] = 9
print(records[1]["score"])
['가', '나', '다']
True
9
Python 정렬은 안정적이어서 같은 정렬 키를 가진 나·다는 입력에서의 상대 순서를 유지한다. 하지만 ranked 안의 사전은 records의 요소와 같은 객체다. 새 바깥 리스트라는 사실만으로 중첩 값 수정까지 원본에서 분리되지는 않는다. score를 나중에 바꿨다고 리스트가 자동 재정렬되는 것도 아니다.
비교할 수 없는 값이 섞이면
values = [3, "2", 1]
try:
sorted(values)
except TypeError as error:
print(type(error).__name__)
print(values)
TypeError
[3, '2', 1]
문자열과 정수를 이대로 비교하면 오류가 난다. 숫자로 볼지 문자열로 볼지 요구에 맞는 일관된 키를 먼저 정해야 한다. 임의 변환으로 서로 다른 의미의 값을 합치지 않는다. list.sort 도중 비교 오류가 나면 리스트가 일부 재배열됐을 수 있으므로 실패 뒤 원래 순서가 보존된다고 가정하지 않는다.
“정렬 결과가 None인 이유: sorted와 list.sort의 차이”에 대한 1개의 생각