[Python] 함수의 특징 – 1
Python 함수의 큰 특징은 return, argument type을 따로 지정하지 않고 자동으로 선택된다.
def add(x,y):
return x+y
a = add(3,4)
print(a)
print(type(add))
| 7 <class ‘function’> <function add at 0x0000021524C383A8> |
위 결과를 보면 함수의 이름은 주소를 가리키며, 함수의 타입은 function class 로 정의된다.
Python의 함수는 C와 마찬가지로 다른 함수로 정의하여 사용 가능하다.
import sys sys.getrefcount(add) add1 = add a = add1(3,4) print(a) print(type(add1)) print(add1) sys.getrefcount(add) del add1 sys.getrefcount(add)
| 2 7 <class ‘function’> <function add at 0x0000021524C383A8> 3 2 |
위 결과를 보면 다른 변수에 함수를 복사 할 수 있으며, 기존 함수 (add) 타입과 동일하며, 주소 또한 동일하다. 즉 함수의 정의는 1개가 선언되어있고, 해당 주소를 가리키고 있는 개수가 3개라는 것을 알 수 있다.
실제로getrefcount() 함수를 통해 해당 reference가 몇번 count 되는지 알 수 있으며, del 매크로를 통해 해당 reference를 제거 할 수 있다.
실제로 Python에선 함수도 object이며, int type 또한 객체이다.
Default Parameter
함수의 default parameter는 정의될 시점에 정해진다.
a = 10
def foo(x=a):
return x
a=5
foo()
| 10 |
위 함수 foo() 의 결과는 5가 나올 것 같지만 10이 나온다. 함수의 정의가 메모리에 올라올 때 default parameter value 또한 저장되기 때문이다.

함수 뿐만 아니라 Python에선 list 또한 객체다. 따라서 다음 코드를 그림으로 표시하게 되면 다음과 같다.
def foo(x, items=[]):
items.append(x)
return items
foo(1)
foo(2)

Default parameter는 runtime에도 존재하기 때문에 list가 default parameter일 경우엔 list 값들이 지속적으로 존재한다.
만약 유저가 함수 호출이 끝나고 list를 초기화하고 싶다면, 즉 호출시에만 list를 생성하고 싶다면 다음과 같이 수정하면 된다.
def foo(x, items=None):
if items is None:
items = []
items.append(x)
return items
foo(1) // 1
foo(2) // 2