[python]ネスト関数


# 중첩 함수란 함수 내에 위치한 또 다른 함수 
# 바깥에 위치한 함수들과 달리 
# 부모 함수의 변수를 자유롭게 읽을 수 있다는 장점이 있음 

# 재할당이 일어나지 않는 경우
def outer_func(s):
    text = s
    
    def inner_func():
        print(text)
        
    inner_func()

if __name__ == '__main__':
    outer_func('hello!')

#출력결과 
#hello!
# 부모 함수에서 선언한 리스트를 조작하는 경우
def outer_func(a_list= []):
    b_list = a_list
    print(id(b_list), b_list)

    def inner_func_1():
        b_list.append(4)
        print(id(b_list), b_list)

    def inner_func_2():
        print(id(b_list), b_list)

    inner_func_1()
    inner_func_2()

if __name__ == '__main__':
    outer_func([1,2,3])

#출력결과
#4341425792 [1, 2, 3]
#4341425792 [1, 2, 3, 4]
#4341425792 [1, 2, 3, 4]
#-> 리스트는 가변 객체이며, 이처럼 중첩 함수에서 변수를 조작할 수 있다.
#이렇게 조작된 값은 부모 함수에서도 그대로 동일하게 적용된다.
# 부모 함수에서 선언한 문자열을 조작하는 경우
def outer_func(s):
    text = s
    print(id(text), text)
    
    def inner_func_1():
        text = 'minhee'
        print(id(text), text)

    def inner_func_2():
        print(id(text), text)

    inner_func_1()
    inner_func_2()

if __name__ == '__main__':
    outer_func('hello!')

#출력 결과
#4371839216 hello!
#4371838832 minhee
#4371839216 hello!
#-> 문자열은 불변 객체이기 때문에 조작할 수 없다. 
#여기서 수정 된 값, 즉 재할당된 값은 부모 함수에서는 반영되지 않는것에 주의한다.