값을 직접 변경하는 연산 대부분은 항상 더 효율적이다. 파이썬은 리스트가 변경될 것을 대비하여 여분의 메모리 일부를 준비하며, 이 여분의 메모리로 +=와 같은 연산 처리를 가능하게 한다. 이는 리스트가 효율적으로 확장되는 것을 돕는다. 간혹 할당된 메모리가 부족하여 리스트의 위치를 옮겨야 할 때가 있다. 하지만 이런 메모리 관리 작업은 아주 매끄럽게 수행되며, 프로그램 동작에 거의 영향을 미치지 않는다.
값을 직접 변경하지 않는 연산은 신규 객체가 생성되어야 하기 때문에 덜 효율적이다. 그래서 큰 문자열을 만들 때 처리 속도가 중요하다면 += 연산자 대신 join 메서드를 사용하는 것이 유리하다. 다음 예시는 리스트를 생성하여 26개의 문자를 함께 연결하기 위해 join 메서드를 사용하는 예시다.
str_list = []
n = ord('a')
for i in range(n, n + 26):
str_list += chr(i)
alphabet_str = ''.join(str_list)
그림 4-1과 그림 4-2는 메모리-값-변경(in-place) 연산과 신규 -객체-생성(non-in-place) 연산의 차이점을 설명하고 있다. 그림 4-1은 문자열 데이터가 기존 문자열에 추가되는 것처럼 보이지만, 실제로는 메모리의 다른 영역을 사용하는 신규 문자열을 만들어서 같은 변수에 다시 대입하고 있는 것을 보여 준다.
▲ 그림 4-1 문자열 추가하기(신규 -객체-생성)