관리 메뉴

정리왕

파이썬 함수7 (함수 안에서 선언한 변수의 효력 범위) 본문

6.개발/파이썬 공부하기

파이썬 함수7 (함수 안에서 선언한 변수의 효력 범위)

정리합니다 2020. 11. 29. 15:40
반응형

함수 안에서 선언한 변수의 효력 범위

함수 안에서 사용할 변수의 이름을 함수 밖에서도 동일하게 사용한다면 어떻게 될까?

이런 궁금증이 생겼던 독자라면 이번에 확실하게 답을 찾을 수 있을 것이다.

다음 예를 보자.

 

 
# vartest.py
a = 1
def vartest(a):
       a = a + 1

vartest(a)
print(a)
 

a = 1  =======> 함수 밖의 변수a

vartest(a) =====> vartest 함수의 입력값으로 a를 줌

print(a) =======> a 값 출력

 

먼저 a라는 변수를 생성하고 1을 대입한다. 다음 입력으로 들어온 값에 1을 더해 주고 결과값은 돌려주지 않는 vartest 함수를 선언한다. 그리고 vartest 함수에 입력값으로 a를 주었다. 마지막으로 a의 값을 출력하는 print(a)를 입력한다. 과연 결과값은 무엇이 나올까?

 

당연히 vartest 함수에서 매개변수 a의 값에 1을 더했으니까 2가 출력될 것 같지만 프로그램소스를 작성해서 실행해 보면 결과값은 1이 나온다. 그 이유는 함수 안에서 새로 만든 매개변수는 함수 안에서만 사용하는 '함수만의 변수'이기 때문이다. 즉 def vartest(a)에서 입력값을 전달받는 매개변수 a는 함수 안에서만 사용하는 변수인지 함수 밖의 변수 a가 아니라는 뜻이다.

 

따라서 vartest 함수는 다음처럼 변수 이름을 hello로 한 vartest 함수와 완전히 동일하다.

 
def vartest(hello):
       hello = hello + 1
        

즉 함수 안에서 사용하는 매개변수는 함수 밖의 변수 이름과는 전혀 상관이 없다는 뜻이다.

 

 

 

다음 예를 보면 더욱 분명하게 이해할 수 있을 것이다.

 
def vartest(a):
       a = a + 1

vartest(3)
print(a)
 

위 프로그램 소스를 에디터로 작성해서 실행하면 어떻게 될까? 오류가 발생할 것이라고 생각한 독자는 모든 것을 이해한 독자이다. vartest(3)을 수행하면 vartest 함수 안에서 a는 4가 되지만 함수를 호출하고 난 뒤에 print(a) 문장은 오류가 발생하게 된다. 그 이유는 print(a)에서 입력받아야 하는 a 변수를 어디에서도 찾을 수가 없기 때문이다. 다시 말하지만 함수 안에서 선언한 매개변수는 함수 안에서만 사용될 뿐 함수 밖에서는 사용되지 않는다. 이것을 이해하는 것은 매우 중요하다.

 

 

함수 안에서 함수 밖의 변수를 변경하는 방법

그렇다면 vartest라는 함수를 사용해서 함수 밖의 변수 a를 1만큼 증가시킬 수 있는 방법은 없을까? 이 질문에는 2가지 해결 방법이 있다.

 

 

1. return 사용하기

 
a = 1
def vartest(a):
       a = a + 1
       return a

a = vartest(a)
print(a)
 

a = vartest(a) ==============> vartest(a)의 결과값을 함수 밖의 변수 a에 대입

 

첫 번째 방법은 return을 사용하는 방법이다. vartest 함수는 입력으로 들어온 값에 1을 더한 값을 돌려준다. 따라서 a = vartest(a)라고 대입하면 a가 vartest 함수의 결과값으로 바뀐다. 여기에서도 물론 vartest 함수 안의 a 매개변수는 함수 밖의 a와는 다른 것이다.

 

 

 

2. global 명령어 사용하기

 
a = 1
def vartest():
       global a
       a = a + 1

vartest()
print(a)
 

두 번째 방법은 global 명령어를 사용하는 방법이다. 위 예에서 볼 수 있듯이 vartest 함수 안의 global a 문장은 함수 안에서 함수 밖의 a 변수를 직접 사용하겠다는 뜻이다. 하지만 프로그래밍을 할 때 global 명령어는 사용하지 않는 것이 좋다. 왜냐하면 함수는 독립적으로 존재하는 것이 좋기 때문이다. 외부 변수에 종속적인 함수는 그다지 좋은 함수가 아니다. 그러므로 가급적 global 명령어를 사용하는 이 방법은 피하고 첫 번째 방법을 사용하기를 권한다.

 

 

 

# lambda

lambad는 함수를 생성할 때 사용하는 예약어로 def와 동일한 역할을 한다. 보통 함수를 한 줄로 간결하게 만들 때 사용한다. 우리말로는 '람다'라고 읽고 def를 사용해야 할 정도로 복잡하지 않거나 def를 사용할 수 없는 곳에 주로 쓰인다.

사용법은 다음과 같다.

 

 lambda 매개변수1, 매개변수2, ..... : 매개변수를 사용한 표현식

한번 직접 만들어 보자.

 

 
>>> add = lambda a, b: a+b
>>> result = add(3, 4)
>>> print(result)
7
 

add는 두 개의 인수를 받아 서로 더한 값을 돌려주는 lambda 함수이다. 위 예제는 def를 사용한 다음 함수와 하는 일이 완전히 동일하다.

※ lambda 예약어로 만든 함수는 return 명령어가 없어도 결과값을 돌려준다.

 

 
 >>> def add(a, b):
	return a+b

>>> result = add(3, 4)
>>> print(result)
7
 

 

반응형
Comments