[코딩도장] 파이썬 함수 안에서 함수 만들기 요약본


nonlocal이라는 생소한 것이 나와서, 코딩도장 강의를 보고 파이썬의 함수 안에서 함수 만들기 요약하려 한다.

[코딩도장] 33.2 함수 안에서 함수 만들기

def 함수이름1():
    코드
    def 함수이름2():
        코드

33.2.1 지역 변수의 범위

  • 지역 변수 hello는 def 안까지 접근 할수 있다.
def print_hello():
    hello = 'Hello, world!'
    def print_message():
        print(hello)
    print_message() 
 
print_hello()
Hello, world!

33.2.2 지역 변수 변경하기

  • 겉으로 보기에는 바깥쪽 함수 A의 지역변수 x를 변경하는 것 같지만
  • 실제로는 안쪽 함수 B에서 이름이 같은 지역 변수 x를 새로 만들게 됨.
def A():
    x = 10        # A의 지역 변수 x
    def B():
        x = 20    # x에 20 할당
 
    B()
    print(x)      # A의 지역 변수 x 출력
 
A()
10

33.2.2(수정) 지역 변수 변경하기

  • 함수의 바깥쪽에 있는 지역 변수 값을 변경하려면 nonlocal 키워드를 사용하면됨.
def A():
    x = 10        # A의 지역 변수 x
    def B():
        nonlocal x    # 현재 함수의 바깥쪽에 있는 지역 변수 사용
        x = 20        # A의 지역 변수 x에 20 할당
 
    B()
    print(x)      # A의 지역 변수 x 출력
 
A()
20

33.2.3 nonlocal이 변수를 찾는 순서

  • (중요) nonlocal은 현재 함수의 바깥쪽에 있는 지역 변수를 찾을 때 가장 가까운 함수 부터 먼저 찾음
  • 실무에서는 여러 단계로 함수를 만들 일 없음. 함수마다 이름이 같은 변수보단 다르게 쓰는게 좋음.
def A():
    x = 10
    y = 100
    def B():
        x = 20
        def C():
            nonlocal x
            nonlocal y
            x = x + 30
            y = y + 300
            print(x)
            print(y)
        C()
    B()
 
A()
50
400

33.2.4 global로 전역 변수 사용하기

  • 함수가 몇 단계든 상관없이 global 키워드를 사용하면 무조건 전역 변수를 사용
  • global 전역 변수는 코드가 복잡해졌을때, 변수의 값을 어디서 바꾸는지 알기가 힘들므로 가급적 사용하지 않는 것을 권장.
x = 1
def A():
    x = 10
    def B():
        x = 20
        def C():
            global x
            x = x + 30
            print(x)
        C()
    B()
 
A()
31

참고 : 코딩도장-Python




© 2018. by statssy

Powered by statssy