본문 바로가기

코딩/파이썬 기초

파이썬 튜토리얼 040. global, nonlocal 키워드를 통한 namespace 이해

 

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