# 중첩 함수란 함수 내에 위치한 또 다른 함수
# 바깥에 위치한 함수들과 달리
# 부모 함수의 변수를 자유롭게 읽을 수 있다는 장점이 있음
# 재할당이 일어나지 않는 경우
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!
#-> 문자열은 불변 객체이기 때문에 조작할 수 없다.
#여기서 수정 된 값, 즉 재할당된 값은 부모 함수에서는 반영되지 않는것에 주의한다.