rueki

Variable Scope(변수 범위) 본문

python

Variable Scope(변수 범위)

륵기 2021. 1. 1. 17:33
728x90
반응형

Inflearn - 모두를 위한 파이썬 : 필수 문법 배우기 강의 정리

 

중요 키워드 : scope, global, local, nonlocal, locals, globals

 

예제 1번. 전역변수에 대해서 알아보자.

a = 10

def foo():
    print('Ex1>', a)
    
foo()

print('Ex1>', a)



"""
결과

Ex1> 10
Ex1> 10

"""

전역 변수 a를 선언하고 foo라는 함수를 선언했는데, 그 속의 a 변수는 전역 변수 a로 호출이 된다.

그래서 단순히 a를 print한 것과 함수를 호출해서 실행한 것은 결과가 같게 나온다.

 

예제 2번. 전역변수와 지역변수

b = 20

def bar():
    b = 30
    print('Ex2>', b)
    
print('Ex2>', b)

"""
결과
Ex2> 30
Ex2> 20
"""

이 예제 같은 경우는 함수의 결과는 30으로 나오고 그 다음 print문은 20이 나온다.

그 이유는 항상 Scope 내 변수를 먼저 찾고 찾고자 하는 것이 없을 때 전역으로 나가기 때문이다.

만약 b = 30이 없었다면 20이 두번 출력되었을 것이다.

 

예제 3번. 지역변수 참조 에러

c = 40
def foobar():
    c = c + 10
    print('Ex3 >', c)
    
"""
결과
UnboundLocalError: local variable 'c' referenced before assignment
"""

이 예제의 경우 foobar라는 함수 scope 안에 c 변수가 없는데 c를 참조하려 했기에 에러가 발생한 것이다.

해결 방법은 + 연산을 하지 않거나 혹은 foobar안에 c = 10 과 같이 지역변수를 선언해주는 방법이 있다.

 

예제 4번. global 기능

d = 50
def barfoo():
    global d
    d = 60
    print('Ex4>', d)
    
barfoo()
print('Ex4>', d)

"""
Ex4> 60
Ex4> 60
"""

d = 50이라는 전역변수를 선언했으나 왜 결과는 전부 60이 나오는 것일까

답은 global이라는 기능 때문이다.

d를 50으로 선언했으나, barfoo안에서 d를 전역변수로 선언하고 60을 할당했기에 결국 전부 60이라는 값이 나오는 것이다.

 

예제 5번. Closure 형태

def outer():
    e = 70
    def inner():
        nonlocal e
        e += 10
        print('Ex5>', e)
    return inner
    
in_test = outer()
in_test()

중첩 함수는 자신을 감싸고 있는 함수의 영역 변수를 참조한다.

이 변수를 변경하고자하면, nonlocal로 선언을 해주어야한다. 이 기능의 의미는 inner 함수의 local로 생각하지 않겠다라고 위에서 해석할 수 있겠다.

 

예제 6번. locals와 globals

#local scope에 무엇이 있는지 알아보는 기능 : locals()
def func(var):
    x = 10
    def printer():
        print('Ex6 >', "Printer Fucn Inner")

    print('Func Inner', locals())

func('Hi')



#globals()
print('Ex7 >', globals())#전역 전체 출력


#변수 생성 자동화
for i in range(1,10):
    for k in range(1,10):
        globals()['plus_{}_{}'.format(i,k)] = i + k

print('Ex8 >', plus_5_5) # 10

locals와 globals를 출력하면 프로그램 내의 지역변수와 전역변수 관련해서 출력이 된다.

 

728x90
반응형
Comments