프로그래밍/PYTHON

python - global, nonlocal keyword

aiemag 2020. 10. 25. 11:08
반응형

python의 global 및 nonlocal keyword에 대해 알아보겠습니다.

 

 

 


global

 

global keyword는 global scope에서 선언된 변수에 대해 하위 code block에서 명시적으로 참조할 수 있도록 선언해주는 역할을 합니다.

 

아래 코드의 3 line에 text라는 변수가 global scope에서 선언되어 있습니다.

 

read_text() 함수에서는 text 변수를 별도 제약 없이 그대로 가져다 읽을 수 있습니다.

코드 블록에 따른 변수의 참조 순위가 LEGB(local -> enclosed -> global -> built-in) 순으로 참조할 수 있기 때문에 읽는 것은 문제가 되지 않습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/python3
 
text = "hello"
 
def read_text():
    print(text)
 
 
def append_text(add):
    global text
 
    text += add
    print(text)
 
 
def main():
    read_text()
    append_text(" world")
 
 
if __name__ == "__main__":
    main()
 
cs

 

실행 결과입니다.

 

 

하지만 append_text() 함수에서 global text 선언 없이 text를 바꾸려고 하면 "UnboundLocalError: local variable 'text' referenced before assignment" 에러가 발생하게 됩니다. 즉 text라는 변수가 할당되지 않았는데 참조되었다는 것입니다.

 

변수를 edit 을 하려면 여기서는 global text 변수를 참조하겠다고 알려주거나, append_text() 함수 내에서 local하게 text 변수를 만들어야 합니다.

 

global 키워드는 global scope에서 선언된 변수를 해당 코드 블록에서 사용하겠다는 것을 알려줍니다.

 


nonlocal

 

nonlocal 키워드는 global 변수는 아니지만 local 변수도 아닌 scope의 변수를 사용하겠다고 선언하는 키워드입니다. 

 

아래의 코드에선 4번째 코드의 text 변수가 nonlocal scope 입니다.

 

nested function인 append_text() 함수에서 nonlocal scope 의 변수를 참조하여 edit 하기 위해서 10 line에서 nonlocal 키워드를 사용하였습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/usr/bin/python3
 
def foo():
    text = "hello"
    
    def read_text():
        print(text)
 
    def append_text(add):
        nonlocal text
        
        text += add
        print(text)
 
    read_text()
    append_text(" world")
 
 
def main():
    foo()
 
 
if __name__ == "__main__":
    main()
cs

 

실행 결과입니다.

 

 

 

반응형

'프로그래밍 > PYTHON' 카테고리의 다른 글

python - Iterable, Iterator  (0) 2021.02.03
python - Decorator  (4) 2021.01.22
python - Closure  (0) 2020.11.03
python - map(), filter(), reduce() usage  (0) 2020.10.27
python 어렵지 않아요  (6) 2020.06.08