프로그래밍 언어/Python

[Python]함수에 배열을 인자로 전달

claire 2022. 7. 12. 18:56

함수에 배열을 전달할 때 배열을 구성하는 요소들이 모두 복사되어 전달되는 것이 아니라 배열의 값들을 가리키는 주소만 전달된다는 것을 알 수 있다. 

 

함수 내에서 전달받은 배열에 새로운 값을 추가하면 함수 밖의 원래 배열에도 추가가 된다. 

 

함수 내에서 새로운 배열을 할당하면 다른 배열을 가리키게 되면서 변수가 가리키는 주소가 달라져서 함수 내에서 아무리 변경해도 함수 밖의 원래 배열에 영향을 끼치지 못한다. 

 

함수 인수 전달 방식 

  • Call by Value

함수에 인수를 전달하는 방식. 변수의 값을 복사해 함수의 인자로 전달한다. 따라서 함수 내에서 전달된 인자를 조작해도 함수 외부의 변수에는 영향을 미치지 않는다. 

  • Call by Reference 

함수에 인수를 전달하는 방식 포인터로 함수의 인자에 전달하는 방식이 이와 같은 방식이다. 변수가 가리키는 주소 값을 함수의 인자로 전달. 함수 내에서 전달된 인자를 조작하면, 함수 외부의 원본 변수의 주소값에 있는 값을 바꿔버린다. 따라서, 함수 내에서 변경된 사항이 함수 외부에도 영향을 미치게 된다. 

  • Call by Object Reference 

Python에서 함수에 인수를 전달하는 방식이다. 

Call by reference와 굉장히 비슷해보이지만 분명한 차이가 존재한다. 

파이썬에서 모든 것은 객체이다. 값들은 변수 내에 저장되는 것이 아니라 1,2 와 같은 객체가 생성되고, 변수가 그 객체를 가리키도록 한다. a=1 c=1 이면, 1이라는 하나의 객체에 a, c 이름표가 두 개 붙어있는 것이다. 

 

mutable obhect는 자신의 id 값은 일정하게 유지하지만, 객체의 값이 변할 수 있다. 하지만 immutable object는 객체의 값을 변경할 수 없다. 대표적으로 수, 문자열, 튜플과 같은 자료형 존재. 

 

immutable object를 가리키는 변수의 값을 변경했을 때 어떤 일이 일어나는지 알아보자. 

def func(c):
	c=2
a=1
func(a)

//이렇게 함수에 a라는 변수를 전달하면 c라는 변수도 a가 가리키는 객체 1을 가리킴. 
//함수 내의 c의 값을 2로 변경하게 되면, c라는 변수의 값이 1에서 2로 바뀌는 것이 아니라, 
//2라는 객체가 생성되고 1에 붙어있던 지역변수 c가 2에 붙게 되는 것이다.

리스트와 같은 Mutable Object에서 내부 값을 변경할 때, 어떤 일이 일어나는지 알아보자. 

 

def func(arr):

    arr.append(5)

a = [1,2,3,4]

func(a)
'''
arr는 지역변수 a와 같은 객체([1,2,3,4])를 가리키게 된다. 여기서 arr.append(5)를 하게 되면, 
리스트는 mutable 하기 때문에 5가 추가된 새로운 객체가 생성되는 것이 아니라 기존의 동일한 id를 가지는 리스트에
5가 추가된다. 따라서 함수가 종료되고 지역변수인 arr가 사라지고 난 후에도 a는 여전히 [1,2,3,4,5]를 가리키게 된다. 

'''