공식 문서에는 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 |
댓글