Pythone에서 *랑 **는 주소값을 의미하는것이 아닙니다. 이것은 바로 함수에서 여러개의 인자를 받을때 사용하는 표시입니다. 여기서 사용되는 *args는 변수 이름이에요. 꼭 args라는 이름을 사용하지 않으셔도 됩니다.
*와 **를 사용한 인자변수는 함수에 인자를 1개 넘길지 여러개 넘길지 몇개넘길지 정할수 없을때 사용하는데요. 아래와 같이 하나의 함수로 인자의 개수에 상관없이 함수가 해당 인자들을 전부 처리하고자 할때 사용되어질수 있어요.
def 함수(*args):
# 여기서 인자들의 처리
함수('인자1')
함수('인자1', '인자2')
함수('인자1', '인자2', ... ,'인자N')
함수안에서 args를 type이 뭔지 출력해보면 data type이 tuple형태라고 나옵니다. (‘인자1’, ‘인자2′, … ,’인자N’)의 형태로 전달이 되는거죠.
이렇게 인자에 값만 나열했을 경우에는 *로 값을 받을수 있는데 key=value형태로 보내는 경우에는 **kwargs로 받을 수 있습니다.
def 함수(**kwargs):
# 여기서 kwargs처리
함수(key1='value1')
함수(key1='value1', key2='value2')
함수(key1='value1', key2='value2', ..., keyN='valueN')
위의 예제와 같이 key=value형태로 나열된 한개 이상의 함수인자는 **로 받아서 key=value형태로 사용할수 있게 됩니다. kwargs의 data type을 확인해보면 dict로 나오구요.
그럼 배운것을 응용해서 약간 복잡할수 있는 문제를 하나 내볼께요. *args와 **kwargs를 둘다 받는 함수 f1이 있다고 칩시다. 그 함수 안에서 f2라는 함수한테 받은 인자를 그대로 전달합니다. 그리고 f2도 마찬가지로 *args와 **kwargs를 둘다 받고 받은 내용을 출력합니다. 과연 f2에서 kwargs에는 어떤 값이 들어있을까요?
def f1(*args, **kwargs):
f2(args, kwargs)
def f2(*args, **kwargs):
print(kwargs)
f1(key='value')
====> {}
결론부터 말씀드리자면 f2에서 kwargs에는 {}, 즉 비어있는 dict가 출력옵니다. 이유는 함수의 인자를 받아서 **를 떼버리면, dict가 된다고 했죠? f1에서 전달할때 kwargs는 key=value쌍을 가지는 하나의 dict입니다. dict는 그 자체로 하나의 value입니다. 그러니 key없이 넘겨지는 value인자가 되겠죠? 그래서 {key=’value’}는 f2에서 kwargs가 아닌 args로 받게 됩니다. args를 출력해보면 거기 들어있어요. 그러면 f2에 함수인자를 넘길때 f1에서 받았던 그대로 넘기고 싶다면 어떻게 하면 될까요?
def f1(*args, **kwargs):
f2(*args, **kwargs)
def f2(*args, **kwargs):
print(kwargs)
f1(key='value')
====> {'key': 'value'}
바로 f2에 함수인자를 넘길때, *와 **가 붙은채로 넘기면 됩니다. 재밌죠? 다음시간에 더 재밌는 이야기로 또 만나요. 바이.
Reference: