728x90
- 알고리즘을 공부하며 조원들과 함께 메모리에대해 이야기를 하던중 파이썬 함수에서 리스트를 받는것과 문자형 정수형을 받는것이 무슨 차이가 있을까? 라는 이야기가 나와 공부해 보았습니다.
함수 호출방법
- 함수 호출방법에는 크게 두 가지가 있습니다.
call by value
와call by reference
가있는데Call by value(값에 의한 호출)
는 인자로 받은 값을 복사하여 처리를 한다.Call by reference(참조에 의한 호출)
는 인자로 받은 값의 주소를 참조하여 직접 값에 영향을 줍니다. 간단히 말해 값을 복사를 하여 처리를 하느냐, 아니면 직접 참조를 하느냐 차이인 것입니다. - 프로그래밍 구조상
Call by value(값에 의한 호출)
를 하면 복사가 되기 때문에 메모리량이 늘어난다. 요즘에는 기기의 성능이 좋아져서 상관이 없다지만 많은 계산이 들어간다면 과부하의 원인이 됩니다. 하지만 복사처리가 되기 때문에 원래의 값은 영향을 받지 않아서 안전합니다.
'Call by value'와 'Call by reference'의 차이
Call by value
: 변수를 복사한 값을 전달하는 방식- 함수의 인자(argument)를 받을 때, 변수에 담긴 값 자체를 stack에다가 복사하여 넘겨줍니다. 예를 들어 변수
a
가 있고 함수def1
가 있을 때,def1(a)
에서 전달받은a
는a
자체(주소 값)가 아니라a
의 복사 값, 레플리카입니다. 따라서 함수 내에서 해당 인자를 조작하여 바꾸었다고 해도 원본 변수a
는 변하지 않습니다. 원본을 건드리지 않아 안전하지만, 함수의 사용으로 해당 전역 변수를 바꾸고 싶을 때는 리턴 값을 다시 전역 변수로 집어넣어야 하는 번거로움과 시간 사용의 단점이 있습니다. - 장점 : 복사하여 처리하기 때문에 안전하다. 원래의 값이 보존됩니다.
- 단점 : 복사하기 때문에 메모리 사용량이 증가합니다.
- 함수의 인자(argument)를 받을 때, 변수에 담긴 값 자체를 stack에다가 복사하여 넘겨줍니다. 예를 들어 변수
Call by reference
: 인자로 받은 변수의 주소값을 전달받는 것- 함수의 인자를 받을 때, 변수가 가리키는 주소 값을 전달한다. 예를 들어 변수
a
가 있고 함수def2
가 있을 때,def2(a)
에서 전달받은a
는 원본 전역 변수a
의 주소 값입니다. 따라서 함수 내에서 해당 인자를 조작하면 원본 변수의 주소 값으로 타고 들어가 해당 값 자체를 바꿔버립니다.. 이를 통해 전역 변수의 즉각적 변경이 가능하지만, 부주의하면 변수를 잘못 조작해 프로그램에 문제를 야기할 수 있습니다. - 장점 : 복사하지 않고 직접 참조하기 때문에 빠릅니다.
- 단점 : 직접 참조를 하기 때문에 원래의 값이 영향을 받습니다.
- 함수의 인자를 받을 때, 변수가 가리키는 주소 값을 전달한다. 예를 들어 변수
그렇다면 파이썬은?
- 파이썬에서의 함수 전달방식은
Call by assignment
입니다. 파이썬의 경우는 위의 경우처럼 주소 값 참조나, 값 복사와 조금 다르다. 이유는 python은 모든 것을 "객체"로 판단한다는 데에 있습니다. 파이썬은 넘겨지는 객체의 종류에 따라서Call by value
와Call by reference
가 나뉘어 집니다.Call by value
에 해당되는 값은 immutable Objectint
,str
,float
,tuple
등 단일 값이거나 static속성을 가지는 객체입니다.Call by reference
에 해당되는 값은 mutable Objectlist
,dict
,set
이 있습니다.
728x90
'알고리즘' 카테고리의 다른 글
[swjungle 2기] 백준 1535 안녕 (0) | 2021.08.30 |
---|---|
[swjungle 2기] 그리디 알고리즘 (탐욕법) (0) | 2021.08.28 |
[swjungle 2기] 도둑! 배낭? Knapsack Problem(배낭문제, 냅색) (0) | 2021.08.27 |
[swjungle 2기] 백준 2617 구슬 찾기 (0) | 2021.08.24 |
[swjungle 2기]위상 정렬 알고리즘 (0) | 2021.08.23 |
댓글