개요
자바에 대한 함수 인자 전달 방식에 대한 얘기를 나누다가 파이썬에서는 함수에 인자를 어떻게 전달 받을까? 라는 의문으로 글을 작성하게 되었다. 결론 먼저 말하자면 역시 파이썬은 특이하다.
함수 인자 전달 방식
함수 인자 전달방식은 각각의 프로그래밍 언어마다 다른 방식을 사용하지만 비슷한 형태를 띄는데 일반적으로 사용되는 함수인자 전달 방식은 call-by-value (값에 의한 호출)와 call-by-reference (참조에 의한 호출)가 있다. 하지만 파이썬은 일반적으로 많이 사용되는 언어인 C언어와 JAVA와 다르게 함수 인자를 Call by assignment 형식으로 전달하기에 이를 알아보려고 한다.
call-by-value (값에 의한 호출)
함수에서 값을 복사해서 전달해주는 방식으로, 전달될 값이 메모리 상에 복사되어 함수인자로 할당된다.
즉, 서로 다른 위치의 메모리에 저장되기 때문에 함수 내부에서 해당 값이 변한다고 해도 함수 밖의 변수의 값은 원본을 유지할 수 있다.
def function(value):
value += 1
print(value) # 함수 안의 value 값을 변경하고 값 출력
value = 2
function(value)
print(value)
############
3
2
############
코드를 보면서 설명을 해보자면, function은 변수의 현재 값에서 1을 더하는 함수이다. 결과를 보면 함수 안에서 value의 값을 변경하였지만 함수밖의 Value를 출력해보면 원본의 값을 유지하는 것을 확인할 수 있다. 이것이 Call By Value이다.
대체로 C언어에서 사용되고 있다.
call-by-reference (참조에 의한 호출)
함수에서 인자를 값으로 전달 하는 것이 아닌 주소값을 전달 하여 호출하는 방식으로 함수의 인자로 넘어간 값이 함수 내부에서 변경되면 실제로 값이 변경된다. 이는 직접적으로 값을 가지고 있는 변수의 주소를 전달하기 때문에 call by reference로 인자를 넘기면 메모리 상에 저장된 실제 값 변경이 가능하다.
하지만, Python에서는 명시적으로 call-by-reference를 지원해주지 않는다. 따라서 함수안에서 값이 변경되는경우 밖에서도 변경이 필요하다면, Python만의 방식인Call by assignment(or Call by object reference)를 사용한다.
Call by assignment?
앞서 말한 대로 파이썬은 모든 것이 객체로 정의되는데 이때 객체의 종류에는 Mutable, Immutable로 나뉘어진다. 이때 함수에 넘겨지는 객체의 종류에 따라서 값이 변경이 가능한가 아닌가로 결정된다고 한다.
- Mutable Object : list, dict, set 등의 객체
- Immutable Object : str, int, tuple 등의 객체
위의 코드에서는 int형의 객체가 넘겨졌기 때문에 원본이 변하지 않았던 것이고, list를 이용해 파이썬에서 call-by-reference를 구현해보면 아래의 코드 결과 처럼 값이 변경된 것을 볼수 있다.
def function(value):
value[0] += 1
print(value) # 함수 안의 value 값을 변경하고 값 출력
a = [2] #리스트로 구성
function(a)
print(a)
############
[3]
[3]
############
하지만, 아래의 코드와 같이 리스트의 값을 변경하는 것이 아닌 다른 리스트로 지정하게 되면 호출되고 나서도 유지가 된다.
def function(value):
value = [1]
print(value) # 함수 안의 value 값을 변경하고 값 출력
a = [2] #리스트로 구성
function(a)
print(a)
######################################
[1]
[2]
######################################
결론
파이썬을 주 언어로 사용하고 있지만 파이썬 내부적으로나 기본적인 동작원리에 대해서 알고 있는 점이 많지 않다고 느껴져 파이썬 기본적인 동작원리에 대해 공부해보려고 한다.
다음 글은 파이썬은 모든 것이 객체로 이루어져 있다는 점에 대해 공부해보려고 한다.
'Language > Python' 카테고리의 다른 글
[Python]GIL 너는 대체 머냐? (0) | 2024.04.15 |
---|---|
[Python]파이썬의 숨겨진 심장박동, 레퍼런스 카운팅 (0) | 2024.04.15 |
[Python]리스트의 메모리 할당 (0) | 2023.03.27 |
[Python]파이썬은 모든것이 객체? (0) | 2022.08.22 |