함수로 인수를 전달하는 방식에는 다음과 같은 2가지의 방법이 있습니다.
그렇다면 파이썬에서는 어떤 방법을 사용할까요? 파이썬에서는 정수나 문자열처럼 변경이 불가능한 객체들은 "값으로 호출하기" 방법으로 전달됩니다.
객체의 참조값이 함수의 매개 변수로 전달되지만 함수 안에서 객체의 값을 변경하면 새로운 객체가 생성되기 때문입니다.
def func(x):
print("x = ", x, " id = ", id(x))
x = 42
print("x = ", x, " id = ", id(x))
y = 10
print("y = ", y, " id = ", id(y))
func(y)
print("y = ", y, " id = ", id(y))
<실행 결과>
y = 10 id = 1381592832
x = 10 id = 1381592832
x = 42 id = 1381593856
y = 10 id = 1381592832
위의 예제에서 우리는 id() 함수를 사용하여 객체의 참조값을 출력하였습니다.
함수 func() 안에서 매개 변수 x의 값을 변경하면 새로운 객체가 생성되어 x에 참조값이 저장됩니다.
우리가 변경 가능한 객체인 리스트를 함수에 전달하면 어떻게 될까요? 상황은 달라집니다.
리스트는 참조값으로 전달됩니다. 리스트는 함수 안에서 변경할 수 있습니다. 즉 리스트의 요소들은 변경될 수 있는 것입니다.
def func(list):
list[0] = 99
values = [0, 1, 1, 2, 3, 5, 8]
print(values)
func(values)
print(values)
<실행 결과>
[0, 1, 1, 2, 3, 5, 8]
[99, 1, 1, 2, 3, 5, 8]
위의 예제에서 func()에서는 리스트 안의 첫 번째 요소를 99로 변경하였습니다. 실행 결과를 보면 원본 리스트도 변경된 것을 볼 수 있습니다.