
global, nonlocal 키워드를 통한 namespace 이해
모듈 내에서 정의한 (예로써 설명하는) 임의 변수는 모듈 내 함수나 클래스의 메서드에서도 사용될 수 있다.
아래의 <코드 1>은 모듈 수준으로 정의한 문자열 변수 hello가 my_function 함수 또는 my_hello 메서드에서도 사용될 수 있음을 보여준다.
<코드 1>
def my_function():
print(hello)
class MyClass:
def my_method(self):
print(hello)
hello = 'hello'
print(hello)
my_function()
myclass = MyClass()
myclass.my_method()
아래의 코드 실행 결과에서 알 수 있듯 출력되는 문자열은 모두 "hello"이다.

아래의 <코드 2>처럼 my_function 함수 내에 동일 이름의 hello 변수를 선언하면, 더이상 my_function 함수 외부에 정의되어 있는 hello 변수는 사용(참조)되지 않는다.
<코드 2>
def my_function():
hello = 'bye bye'
print('1', hello)
hello = 'hello'
my_function()
print('2', hello)

함수 외부에 정의되어 있는 변수를 함수 내에서 사용하면서 값도 변경하고자 하는 경우, global 키워드를 사용해 해당 변수는 함수 외부에 정의되어 있는 변수임을 선언하게 된다.
아래의 <코드 3>은 그 사용의 예를 보여준다.
<코드 3>
def my_function():
global hello
print('1', hello)
hello = 'bye bye'
print('2', hello)
hello = 'hello'
my_function()
print('3', hello)

코드 분석을 어렵게 만들 수도 있겠다 생각되는 것으로 함수 내에서 모듈 수준의 변수를 정의할 수도 있다는 것이다.
아래의 <코드 4>는 my_function 외부에서 변수 선언 없이 hello 변수를 사용만 하는 예를 보여준다.
<코드 4>
def my_function():
global hello
hello = 'hello, my function'
print('1', hello)
my_function()
print('2', hello)

nonlocal 키워드는 (예로 설명하는) 함수에서 해당 함수를 둘러싸고 있는 가장 인접한 영역에 정의되어 있는 변수를 사용(참조)하고자 할 때 사용한다.
아래의 <코드 5>는 my_function_1에서 정의한 what 변수의 값을 my_function_3에서 변경하는 코드의 예이다.
<코드 5>
def my_function_1():
def my_function_2():
def my_function_3():
nonlocal what
what = 'python 3.x'
my_function_3()
what = "python"
print(what)
my_function_2()
print(what)
my_function_1()

nonlocal 키워드는 모듈 수준으론 사용되지 않는다.
아래의 <코드 6>을 실행하면 SyntaxError가 발생한다.
<코드 6>
def my_function():
pass
nonlocal hello

'코딩 > 파이썬 기초' 카테고리의 다른 글
| 파이썬 튜토리얼 042. 클래스의 상속과 supper 클래스 (0) | 2021.09.03 |
|---|---|
| 파이썬 튜토리얼 041. 클래스 정의 및 클래스 attributes (0) | 2021.08.24 |
| 파이썬 튜토리얼 039. 오류 처리를 위한 try, except, else, finally 문 그리고 raise 문 (0) | 2021.08.14 |
| 파이썬 튜토리얼 038. JSON 파일 쓰기 (0) | 2021.08.12 |
| 파이썬 튜토리얼 037. 텍스트 파일 읽기 (0) | 2021.08.04 |