Python & Data

python 매개변수의 기본값

softserve 2021. 6. 7. 17:19
반응형

 

python에서는 매개변수(parameter)에 기본값(default value)를 설정할 수 있다.

 

def f(x, y = 0): # y값이 주어지지 않았을 경우 y의 기본값을 0으로 한다.
	print(x + y)
    
f(1, 2) # 1과 2를 더한 값을 출력한다.

f(1) # y가 주어지지 않았으므로 1과 0을 더한 값을 출력한다.

만약 위 예제에서 y에 기본값을 부여하지 않은 상태에서 f(1)과 같이 x값만을 인자로 전달하는 문장을 실행하게 되면 

 

컴파일 에러가 발생한다.

 

다음은 y에 공백 리스트 [ ] 를 기본값으로 부여한 예제이다.

def f(x, y = []):
	
    for i in range(x): # 0부터 x까지의 숫자를

    	y.append(i)  # list y에 추가한다.
    
    print(y)
    
f(5) # [] -> [0 1 2 3 4]

f(5, [-2,-1]) # [-2 -1] -> [-2 -1 0 1 2 3 4]

f(4) # [0 1 2 3 4] -> [0 1 2 3 4 0 1 2 3]

f(5)와 같이 함수호출시 y가 주어지지 않으면 기본값 y 리스트( [ ] )에 0부터 4까지의 숫자를 추가한다.

 

f(5, [-2, -1])은 y 인자로 [-2, -1] 리스트가 주어졌으므로 0부터 4까지의 숫자를 이 리스트에 추가한다.

 

문제는 다시 f(4)를 호출하는 경우이다.

 

이미 f(5) 호출시 기본값 리스트에 값이 추가되었으므로 [0 1 2 3 4] 에 0부터 3까지의 숫자를 추가하게 된다.

 

즉 기본값은 함수를 정의할 때 설정되고, 이후에 함수 호출을 거듭할 경우 그 값이 변할 수 있다(mutable)

 

이 문제의 해결방법은 다음과 같다.

def f(x, y = None):

    if y is None: # y가 주어지지 않은 경우
    
    	y = [] # y를 리스트로 초기화한다.
    
    for i in range(x):
    
    	y.append(i)
        
    print(y)
    
f(5)

f(5, [-2, -1])

f(4)

f(3)

f(2)

f(1)

함수를 호출할 때마다 y의 인자가 주어졌는지 확인하여 초기화를 수행하므로, 각 함수의 실행결과가 각각 독립적이다.

 

반응형