본문 바로가기
Python

[Python] 참조값에 의한 인수 전달 - call by value, call by reference

by 박사과정 모닝 2023. 10. 10.
반응형

1. call by value

  • 함수를 호출할 때 변수를 전달하는 경우가 있음
  • 이때 함수에 전달되는 것은 변수가 가지는 '값'임
  • 이 값만 복사되어 전달되기 때문에 변수 자체가 가지는 값은 이 값이 함수에 전달되어 여러가지 계산 과정을 거치며 변형되더라도 함수 바깥의 변수에는 아무런 영향을 끼치지 못함
def plusNum(n):
    n=n+1
    
k = 10
print('k=', k)
plusNum(k)
print('k=', k)
  • 위와 같이 함수를 정의하고 실행하면 아래와 같이 출력됨
>>> k= 10
>>> k= 10
  • 이러한 원리를 값에 의한 호출(call by value)라고 함
  • 문자열을 함수에 전달해도 마찬가지임
  • 이것은 파이썬에서 숫자나 문자열이 변경 불가능한 객체(immutable object)이기 때문임
    • 파이썬에서 변수는 '객체'라는 것을 설명한 바 있음
    • 변수에 값을 저장할 때, 변수가 실제로 저장하고 있는 것은 값이 저장된 메모리의 주소 즉 '포인터'임
    • 우리가 변수에 숫자나 문자열을 저장한 다음, 다시 다른 값을 새로 저장하면 '새로운 값'을 가지는 '새로운 객체'가 생성되고 변수는 이 새로운 객체의 포인터를 저장하게 됨(기존의 메모리 공간에 저장된 값을 지우고 새로 덮어쓰는 것이 아님)
    • 숫자나 문자열이 변경 불가능한 객체(immutable object)임을 기억해야 함
    • 따라서, 함수에는 변수가 가지고 있는 포인터에 저장된 '값' 만을 넘겨주고 그 결과는 새로운 객체를 생성하여 저장되기 때문에 바깥의 함수는 기존의 값이 저장된 포인터를 그대로 가지고 있음
  • 문자열을 변경했을 때 새로운 객체가 생성되는 것을 아래와 같이 확인할 수 있음
>>> msg = 'hello'
>>> print(msg)
hello
>>> print(id(msg))
60541125
>>> msg = msg+', my friend!'
>>> print(msg)
hello, my friend
>>>print(id(msg))
60543854

 

2. call by reference

  • 변수와는 달리 '리스트'는 변경이 가능한 객체(mutable object)임
  • 리스트의 경우, 함수에는 리스트의 참조값이 직접 전달됨.
  • 따라서, 함수에서 참조값을 이용해 리스트 자체를 변경하면 리스트는 변경이 가능하기 때문에 새로운 객체를 생성하지 않고 기존의 객체를 수정함
def addList(li):
    li += [100,200]
    
li1 = [1, 2, 3, 4, 5]
print(li1)
print(li1)
addList(li1)
print(li1)
print(li1)
[1, 2, 3, 4, 5]
1578967310528
[1, 2, 3, 4, 5, 100, 200]
1578967310528

 

반응형