Programming/Python

[ Python_심화 ] 2. 변수

Jerrykim91 2020. 6. 25. 22:16
반응형

2. 파이썬 심화 - 변수


변수

뒷부분에 나올 클로저를 알기 위해서는 반드시 개념을 숙지하고 지나가야 하는 부분이다.



전역 변수(Global variable)

  • 함수 밖에서 만들어진 변수
  • 프로그램 전체에서 동작
  • 프로그램이 복잡해질수록 골치 아파지는 변수

전역 변수 예제

# 전역변수 예제 

x = 100  
def val():
    print(x) # 전역변수 

val()
print(x)

# Output
# >>> 100
# >>> 100


지역변수(Local variable)

  • 함수 안에서 만들어 진 변수 그래서 함수 내부에서 동작
  • 함수의 외부에서는 지역변수를 호출 x

지역변수 예제

## 지역변수 예제 

x = 100  
def val():
    x = 10  # 지역변수 ->  함수 외부에서 호출 x 
    print(x) 

val()
print(x)

# Output
# >>> 10
# >>> 100


함수 안에서 전역 변수의 값을 변경 - Global 사용

- 함수안에서 전역 변수의 값을 변경하려면 global

  • 함수의 단계 상관없이 global 키워드를 사용하면 무조건 전역 변수를 사용하게 된다.

x = 100  
def val():

    global x   # 전역변수로 선언 
    x = 10     # 지역변수 x -> 전역변수로 변경  
    print(x) 

val()
print(x)

# Output
# >>> 100
# >>> 100



다중 함수 - global 사용

## global 사용 
x = 1                   # 1번
def fstPhase():
    x = 50              # 2번
    def fstPart():
        x = 70          # 3번
        def fstStep():
            global x    # 1번 변수를 호출해서 사용 

            x = x + 80  # 1 + 80 = 81
            print(x)

        fstStep()

    fstPart()

fstPhase()

# Output
# >>> 81 


함수에서 값을 주고 받을 경우에는 매개 변수와 변환 값을 사용하는 것이 좋다.

왜냐하면 전역 변수는 코드가 복잡할 때 변수의 값을 어디서 바꾸는지 알기가 힘들기 때문이다.
그래서 전역변수는 가급적이면 사용하지 않는 것을 권한다.



상위 함수의 지역변수 호출 - nonlocal 사용

파이썬에서는 함수에서 변수를 만들면 항상 현재 함수의 지역변수가 된다.

## 지역변수 변경
def Outer():
    x = 35         # Outer의 지역변수 x

    def Inner():
        x = 25     # Inner의 지역변수 x
    Inner()
    print(x)       # 지역변수 출력 

Outer()

# Output
# >>> 35 -> 당연한 결과 -> Outer함수의 지역변수를 호출


이중 함수 안의 지역변수를 이중 함수 밖(Outer에서)에서

즉, Inner의 지역변수 x를 외부에서 호출하려면 nonlocal 을 사용하면 된다.


# Inner의 x를 출력하려면
def Outer():
    x = 35     
         # 지역변수 x
    def Inner():
        nonlocal x  # 현재 함수의 외부에서 이 지역변수를 사용 가능 
                    # -> 잘 사용 할 일은 없을것 
        x = 25    
    Inner()
    print(x)        # 지역변수 출력 

Outer() 
# Output
# >>> 25 # Outer함수의 지역변수가 아니라 Inner함수의 지역변수를 호출  


nonlocal을 어디서, 왜 써야 하는지 감이 안 와서 이해를 위해 조금 더 알아봤다.


def Outer():
    x = 10

    def Inner():
        x += 10
        print('x:', x)
    Inner()
Outer()

# Output
# >>> UnboundLocalError: local variable 'a' referenced before assignment


이 경우 UnboundLocalError: local variable 'a' referenced before assignment 라는

에러가 발생하는데,
이 에러는 해당 범위 내에서 변수를 할당을 할 때
할당되는 변수가 파이썬에 의해서 자동적으로 로컬 변수로 간주되어서 발생한 에러이다.
그래서 변수에 용도에 맞도록 nonlocal 혹은 global 이름표를 달아 주어야한다.

아래 예제의 경우에 nonlocal을 사용한다.


# nonlocal을 추가 
def Outer():
    x = 10

    def Inner():
        nonlocal x # 추가된 항목
        x += 10
        print('a:', x)
    Inner()
Outer()

# Output
# >>> a: 20



Reference

'Programming > Python' 카테고리의 다른 글

[ Python_심화 ] 4. 클래스_02  (0) 2020.06.27
[ Python_심화 ] 4. 클래스_01  (2) 2020.06.26
[ Python_심화 ] 3. 클로저(Closure)  (0) 2020.06.25
[ Python_심화 ] 1. 재귀호출  (0) 2020.06.25
[Python] 데이터 획득 Lv정리  (0) 2019.08.16