티스토리 뷰

함수 호출 방식에서 


call of value 는 함수에 값을 넘겨주는 것이고


call of reference 는 함수에 주소를 넘겨주는 것이다.


파이썬에서는 이것이 어떻게 동작하는 지 알아보자





함수에 인자 값을 넘겨 주고 그 함수에서 해당 인자를 수정해 보자

def foo(a):
a
= 10


n = 1
foo(n)
print(n)


n 은 몇이 출력 될까?


1 이 출력된다. 


이유는 a 변수에 값 1이 할당되고


a 을 10 으로 변경하였지만 foo 함수가 종료되는 시점에 foo 함수안에 a 이라는 변수는 해제된다.


그리고 함수밖에 n은 그대로 1 이다.




[id]


이것을 실제로 확인해 보기 위해 id 라는 함수를 이용해보자


id 는 객체의 고유 주소값을 리턴하는 함수이다.


예를 들어 a, b 가 주소값이 서로 같다는건 a 를 변경해도 b가 변경되고


b 를 변경해도 a가 변경된다는 의미이다.


a, b 의 고유 주소값이 같다는 것은 곧 같은 주소에 있다는 뜻이다.




def foo(n):
print("before", id(n))
print("10", id(10))
n = 10
print("after", id(n))


a = 1
foo(a)
print("result", id(a))

출력

before 1560266880
10 1560267024
after 1560267024
result 1560266880

여기서 재밌는 사실이 있는데  주소값이 foo 함수 첫줄에서


a 와 n 이 동일하다.


그리고 n 을 10 으로 재 정의 하니까 주소 값이 달라 진다.


여기서 id(10), 과 id(n) 의 값이 같다.


물론 결론적으로 밖의 a 는 그대로 1 이다



여기서 알 수 있는 사실은 


int 형 변수인 경우에 넣는 숫자에 따라 주소값이 달라진다.


그리고 함수 내부에서 바꾸어도 외부에서는 값이 바뀌지 않는다.





def foo(n):
print("before", id(n))
n[0] = 99
print("after", id(n))


a = [1, 2, 3]
foo(a)
print("result", id(a))
print(a)

출력

before 55461008
after 55461008
result 55461008
[99, 2, 3]

리스트의 경우를 살펴 보자


a 의 주소값과 n 의 주소값은 동일하다


그리고 n[0] 의 값을 바꾼 후에도 n 의 주소값은 동일하다


즉 같은 주소 a, n 은 같은 주소 값이 유지되고


n 을 변경하면 a 도 변경이 된다.





결론적으로 파이썬은 다른 언어에서 얘기하는 call of value , call of reference 둘다 아니다


데이터 타입에 따라 다르다




'python lecture > basic' 카테고리의 다른 글

[edu] if문 (조건문)  (0) 2019.01.30
[edu] variable (변수)  (0) 2019.01.30
[edu[ coroutine (코루틴)  (0) 2019.01.30
[edu] 딕셔너리 컴프리헨션 (dictionary comprehensions)  (0) 2019.01.30
[edu] 딕셔너리 (dictionary)  (0) 2019.01.30
댓글