이 코드는 리스트 값 자체가 변경되기 때문에 신규 리스트를 생성하여 변수에 대입하지 않아도 기대한 대로 동작한다. 하지만 다음 예시는 전달한 리스트를 변경할 수 없다.
def set_list_vals(list_arg):
list_arg = [100, 200, 150]
a_list = [0, 0, 0]
set_list_vals(a_list)
print(a_list) # [0, 0, 0] 출력
이 코드는 함수를 호출한 후에도 a_list 값이 변경되지 않는다. 무슨 일이 벌어진 것일까?
이유는 전달된 리스트 인수인 list_arg가 완전히 새로운 리스트로 재대입되었기 때문이다. 변수 list_arg와 기존 데이터 [0, 0, 0]의 관계는 끊어진 것이다.
반면 슬라이싱과 인덱싱은 다르다. 인덱스가 매겨진 특정 항목이나 슬라이싱으로 확보한 하위 리스트를 변경한다고 해서 변수가 참조하고 있는 객체가 변경되지는 않는다. 다음 코드는 여전히 같은 리스트를 참조하지만 첫 번째 항목은 수정된다.
my_list[0] = new_data # 리스트 데이터를 실제로 변경한다.