변경 불가능 객체는 값을 바꾸려면 다른 메모리 공간에 새로운 객체를 만든 다음에 참조를 통해 새로 만든 객체를 가리키게 만드는 수밖에 없습니다. 튜플을 생각해 보세요. 튜플 값을 변경하려면 새로운 튜플을 만드는 수밖에 없습니다. 튜플의 요소를 변경할 수 없기 때문입니다. 하지만 리스트는 변경 가능 객체입니다. 그림 5-12를 잘 보면 리스트의 첫번째 요소 값을 변경할 때 값 객체만 새로운 공간에 만들어 참조하면 됩니다. 즉, 값을 변경하기 위해 리스트 자체를 다른 메모리 공간에 새로 할당할 필요가 없습니다.
그림 5-13은 코드 5-11에서 #1을 실행한 다음의 모습입니다.
그림 5-13 call_by_obj_ref3.py 스택 프레임
코드 5-10과 달리 이번에는 다른 메모리 공간에 새로운 리스트를 만들어 li로 참조했습니다. 요소가 아니라 리스트 자체를 변경하였습니다. 이 경우에는 함수 호출이 끝나면 func 스택 프레임이 사라지면서 새로 만들어진 리스트는 삭제됩니다. main의 지역 변수인 리스트 li는 변경되지 않습니다.