본문 바로가기
Python

[Python] call by assignment (call by object, call by object reference)

by 혀나Lee 2016. 10. 26.

공식 문서에는 Python은 call by assignment라고 되었다. Python은 모든 것이 객체(object)이고 객체에는 두 가지 종류가 있다.


1. immutable object

int, float, tuples 등이 함수 arguments로 넘어갈 땐 call by value로 넘어감. 

2. mutable object

list, dict, set과 같이 mutable object 가 argument로 넘어가면 object reference가 넘어가서 담고 있는 값이 바뀔 수도 있다.


>>> def spam(eggs):

...     eggs.append(1)

...     eggs = [2, 3]

... 

>>> ham = [0]

>>> spam(ham)

>>> print(ham)

[0, 1]


eggs.append(1)은 caller scope까지 적용되었고 eggs=[2, 3]은 callee scope에서는 적용되었지만 caller scope까지 적용되지 않았다.

Python에서 parameter argument 를 이용할 때 scope를 주의하기만 하면 코드를 간결하게 작성할 수 있을 것 같다.

예제 1

>>> def foo(y):

...     y = y**2

... 

>>> x = 5

>>> foo(x)

>>> print(x)

5


>>> def foo(y):

...     y[0] = y[0]**2

... 

>>> x = [5]

>>> foo(x)

>>> print(x[0])

25


변수 값을 전달한 위의 예제에서는 값만 복사한 것이기 때문에 x 의 값이 변경되지 않았지만 아래의 결과에서는 reference 를 전달했으므로 x의 값이 변경되었다.

아래의 예제를 보면 확실히 이해될 것이다.

예제 2

>>> def append_one(li):

...     li.append(1)

... 

>>> l = [0]

>>> append_one(l)

>>> print(l)

[0, 1]


>>> def append_one(li):

...     li = [0, 1]

... 

>>> l = [0]

>>> append_one(l)

>>> print(l)

[0]


두번째 예제를 보면 확실히 알 수 있듯이 함수 내에서 객체 자체를 새로 생성하면 reference 가 바뀌기 때문에 l 값은 변경이 되지 않는다. 하지만 append() 함수를 이용하여 추가하면

reference를 알고 있기때문에 l 의 결과에 1이 추가된 것을 알 수 있다.


'Python' 카테고리의 다른 글

[Python] Private PYPI  (0) 2016.11.09
[Python3] two list for loop  (0) 2016.11.08
[Python] 파이썬 정규식  (0) 2016.10.27
[Python] RabbitMQ Publish Subscribe  (0) 2016.10.26
[Python] SQL Injection 과 보호 방법  (0) 2016.10.13

댓글