파이썬과 인자(argument)
이 글의 작성자는 C/C++ 프로그래밍을 하던 사람이다. 이 글은 Python을 복습하며 작성하는 글이니, 부족한 부분이 있으면 얼마든지 피드백을 주시기 바란다.
매개변수(parameter) vs 인자(argument)
함수를 다루다보면 매개변수라는 말과 인자라는 말을 들을 수 있다. 그리고 이 말을 혼용해서 사용하는 경우도 종종 볼 수 있다. 하지만 엄연히 따지고 보면 두 단어는 차이가 있는 단어이다.
매개변수(parameter)는 함수에 선언되어서 호출할 때 값을 받아들이는 변수이다.
인자(argument)는 함수를 호출할 때 전달하는 값이다.
다음 코드를 통해 무엇이 매개변수이고 인자인지 알아보자. 지난번에 살펴봤던 더하기 함수이다.
def plus(a,b):
return a+b
plus(2,3)
위의 코드에서 각각 매개변수와 인자는 무엇일까?
매개변수는 plus 함수 선언에 있는 a
와 b
다.
인자는 plus 함수를 호출할 때 쓰는 2
와 3
이다.
위와 같이 엄연히 차이가 있긴 하지만, 함수의 괄호 안에 들어간다는 공통점 때문인지는 몰라도, 인자와 매개변수를 혼용해서 사용한다고 해도 생각보다 혼란이 오지는 않는다. 다만 정확히 알아둬서 나쁠건 없다. 이 내용은 기억할 수 있으면 기억하고 넘어가자.
함수의 인자 두 종류
Python에서 사용할 수 있는 인자는 두 종류가 있다. 더하기 함수를 예시로 해서 알아보도록 하자. 여기서 매개변수 a
와 b
의 값이 무엇인지 확인하는 코드를 추가해보자.
def plus(a,b):
print(a,b)
return a+b
위치 인자 (positional argument)
우리가 지금까지 써 오던 인자다. 인자를 각각의 위치에 맞는 매개변수에 복사한다. 당장 매개변수와 인자의 차이를 설명하던 코드를 그대로 사용해보자.
plus(2,3)
그러면 a와 b의 값이 각각 2와 3이 나오는 것을 확인할 수 있다.
매개변수는 a
와 b
의 순서대로 선언되어 있다. 그리고 plus 함수를 호출할 때, 2와 3의 순서대로 집어넣었다. 제일 먼저 들어간 2는 제일 먼저 선언된 매개변수 a
에 들어갔고, 그 다음으로 들어간 3은 그 다음으로 선언된 매개변수 b
에 들어갔다.
즉, 인자는 매개변수가 선언된 순서대로 들어갔다라고 할 수 있다. 만약 2와 3의 위치가 바뀌었다면, a
에는 3이 들어갔을 것이고, b
에는 2가 들어갔을 것이다. 인자가 들어간 위치가 중요하므로, 위치 인자라고 불리는 것이다.
키워드 인자 (keyword argument)
그리고 Python에는 키워드 인자라는 것이 있다. 이렇게 생겼다.
plus(a=2, b=3)
대충 살펴보면 plus 함수의 매개변수에 직접 값을 대입하고 있는 것 처럼 보인다.
맞다. 직접 집어넣는 것이다. 그리고 위의 코드로 호출하면 a
와 b
의 값이 각각 2와 3이 나오는 것을 확인할 수 있다.
그러면 위치를 바꿔도 그렇게 나올까?
plus(b=3, a=2)
위의 코드를 실행해도 여전히 a
는 2, b
는 3이 나오는 것을 확인할 수 있다.
사실 리스트의 정렬을 할 때 키워드 인자를 한 번 사용한 적이 있다. 오름차순/내림차순을 결정할 때 어떻게 했었는지 다시 한번 생각해보자.
위치 인자와 키워드 인자를 같이 쓴다면
위치 인자와 키워드 인자를 같이 쓸 수도 있다.
plus(2, b=3)
위의 코드를 실행하면 a
는 2, b
는 3이 나오는 것을 확인할 수 있다. 그러면 이번에도 위치를 바꿔도 될까?
plus(b=3, 2)
그러면 다음 에러를 볼 수 있을 것이다.
SyntaxError: positional argument follows keyword argument
직역하자면, 위치 인자가 키워드 인자 다음에 나왔다라는 에러가 발생하고 있다. 즉, 키워드 인자를 사용하기 시작했으면 키워드 인자만 계속 써야 한다. 그 뒤로 위치 인자가 나오면 에러다.
그러면 이렇게 쓰는건 어떨까?
plus(2, a=3)
위치 인자를 먼저 사용했고, 마지막으로 키워드 인자를 사용했으니 문제가 없어 보일 수 있으나, 이것 또한 에러다. 어떤 에러가 발생하는지 확인해보자.
TypeError: plus() got multiple values for argument 'a'
a
에 다수의 값이 들어가고 있다는 에러를 확인할 수 있다.
2는 위치 인자이기 때문에 맨 처음 선언된 매개변수 a
에 들어간다. 거기에 키워드 인자로 a
를 지정하고 3을 대입하고 있기 때문에, Python은 “그래서 a
에다 뭘 집어넣으란거야?” 라는 말을 하고 있는 것이다.
사실 위와 같은 함수에서 일부러 위치 인자와 키워드 인자를 섞어서 사용할 일이 얼마나 있을지는 잘 모르겠다. (본인은 C/C++을 주로 하던 사람이기 때문이다)
하지만 다음에 알아볼 내용에서는 섞어서 쓸 일이 생길 것 같다.
Comments