[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