파이썬은 Call by reference? Call by value?

YunGyu Choi·2023년 1월 23일
1

Python

목록 보기
1/2
post-thumbnail

파이썬은 call by reference일까? call by value일까?
아니 그보다 먼저 call by reference와 call by value는 뭐야?

함수의 인자 전달 방식

  • 두 방식은 함수의 인자 전달 방식이다. 즉, 함수에서 인자를 불러올 때 어떻게 그 값을 호출하는지 그 방법에 대한 것이다.

Call by value : 변수의 복사값을 전달하는 방식

  • 함수의 인자를 받을 때, 변수에 담긴 값을 Stack에 복사해서 넘겨준다.
  • 따라서 함수 내에서 해당 인자를 바꾸었다고 해도 원본 변수 a는 변하지 않는다.
  • 예시 : func1(A)에서 A는 A자체(주소값)가 아니라 a의 레플리카(복사값)이다.
  • 장점 : 원본을 건드리지 않아서 안전하다.
  • 단점 : 함수의 사용으로 해당 전역변수를 바꾸고 싶을 때는 리턴 값을 다시 전역 변수로 집어 넣어야 해서 번거롭고 추가시간이 발생한다.
a = 1
print(f'global : {a}')
def func1(a):
	a += 1
    return a
print(f'local : {func1(a)}')
print(f'global : {a}')

global : 1
local : 2
global : 1

Call by reference : 변수의 주소값을 전달하는 방식

  • 함수의 인자를 받을 때, 변수가 가리키는 주소값을 전달한다.
  • 따라서 함수 내에서 해당인자를 조작하면 원본 변수의 주소 값을 타고 들어가 해당 값 자체가 변하게 된다.
  • 예시 : func2(B)에서 B는 B자체(주소값)이다.
  • 장점 : 전역 변수를 즉각적으로 변경 가능하다.
  • 단점 : 부주의하면 변수조작을 잘못해서 프로그램이 잘 작동하지 않는다.
b = 10
print(f'global : {b}')
def func2(b):
	b += 1
    return b
print(f'local : {func2(b)}')
print(f'global : {b}')

global : 10
local : 11
global : 11

파이썬은 Call by reference? Call by value?

  • 공식문서에 따르면 둘 다 아니다.
  • 파이썬은 Call by assignment(Call by object-reference)이다.

Call by assignment

  • Immutable Object인 경우에는 Call by value형식으로 변수를 핸들링하고,
  • Mutable Object인 경우에는 Call by reference형식으로 변수르 핸들링 한다.

❓Immutable vs Mutable

  • Immutable : tuple, str, int 등 불가변적인 포맷의 자료형
  • Mutable : list, set, dictionary 등 가변적인 포맷의 자료형

⭐️ 한 줄 정리

  • 파이썬의 함수 인자 호출 방식은 인자로 받는 객체의 자료형에 따라서 다르다!
profile
velog에는 이론을 주로 정리하고, 코드와 관련된 것은 Git-hub로 관리하고 있어요. 포트폴리오는 링크된 Yun Lab 홈페이지를 참고해주시면 감사하겠습니다!

0개의 댓글