본문 바로가기

Studying/Python

1. Variable Scope (scope, global, nonlocal)

python에서 우리는 scope에 대한 개념을 자연스럽게 자주 사용하고 있다.

 

scope는 어떤 변수, 객체 등이 적용될 수 있는 영역을 다루는 이야기라고 생각하면 된다. 

 

이 변수가 어떻게 생성되었는지에 따라 분류가 가능하다.  

 

영역을 벗어나면 객체를 사용할 수 없기 때문에 혼동하지 않는 것이 중요하다. 

 

"python LEGB" 규칙에 따르면 scope는 아래 4종류로 분류할 수 있다. 

 

** LEGB Rule :  Local > Enclosing > Global > Built-in 순서대로 python 인터프리터가 논리구조를 따진다.**

 

1. local scope (지역변수)

2. enclosing scope 

3. global scope (전역변수)

4. built-in scope

 


1. local scope (지역변수)

local scope는 말 그대로 특정 지역에서만 유효한 변수, 혹은 객체를 의미한다.

 

주로 함수 내부에서 선언된 변수나 함수를 예로 들 수 있다. 

 

함수 내부에서 선언되었기 때문에 기본적으로는 선언된 함수 내부에서만 접근 가능하다.

 

따라서 함수 내의 로직 해결에 국한할 경우, 소멸주기 함수를 실행하는 경우, 선언하는 것이 일반적이다. 

 

local_scope_var은 local scope기 때문에 print(local_scope_var) 에서 오류 발생

2. enclosing scope 

enclosing scope는 중첩함수가 있을 때 적용되는 scope이다. 

 

부모 함수에서 선언된 변수는 중첩 함수 내부에서도 유효하다.

 

외부 함수에서 선언된 변수나 함수는 그 내부 함수에까지 영향을 미친다고 생각하자. 

 

그러나 마찬가지로 부모 함수 외부에서는 그 변수를 호출할 수 없다. 

 

enclosing_var가 중첩함수인 inner_func에서도 유효

3. global scope (전역변수)

어쩌면 가장 이해하기 쉬운 scope라고 생각된다.

 

함수 외부에서 선언된 변수를 global scope, 전역변수라고 한다.

 

이 변수는 선언된 이후부터 코드 내부 어디에서도 사용 가능하고, 어떤 함수에서도 사용 가능하다. 

 

global_var를 함수내부로 호출해 사용 가능

4. built-in scope

built-in scope는 scope 중 가장 범위가 큰 것으로, python에 내장되어 있는 함수, 속성의 변수를 의미한다. 

 

따로 len( ), pring( )처럼 선언이 없이도 사용할 수 있다. 

 


위 개념들을 바탕으로 우리가 실제 코드를 작성할 떄, 전역변수 값을 함수내부에서 수정하거나 함수 내부의 지역변수를

 

전역변수로 보내야할 경우가 있다. 그럴 때 필요한 내용이 global, nonlocal 이다. 

 

먼저 전역변수의 값을 변경하기 위해 global 예약어를 사용할 때를 보자.  

 

이 경우, ex1( )을 통해 20이 출력되지만, 마지막 줄을 통해 다시 10이 출력된다.

 

전역변수 a는 변하지 않고 10이기 때문이다.  

 

이 때, a를 함수를 통해 수정하고 싶으면, global 키워드를 선언해주면 된다. 

 

이렇게 되면 전역변수는 2로 수정, 출력이 된다. 

 

전역변수를 수정하는 경우 이외에도, 지역변수에 global을 통해 전역변수를 생성할 수 도 있다.

 


변면, 부모 함수(바로 상위 함수)에서의 지역변수를 불러와 수정 할 경우, nonlocal을 선언한다.  

 

이 경우, outer 함수의 흐름을 보면, 

 

1. outer 함수의 지역변수 b는 100

2. inner 함수의 nonlocal을 만나 상위 영역의 변수(100인 b)는 150을 할당

3. 150으로 새로 할당된 b를 print 구문으로 출력

 

으로 정리할 수 있다.