파이썬(Python)/문법

파이썬 함수안에 함수, 중첩함수

끄적끄적아무거나 2020. 12. 11. 11:01
반응형

 

가끔 함수안에 함수를 쓰는 경우가 있는데 하나의 함수로 코드를 끝내고 싶을 때 쓰긴하지만 비효율 적이라 보통은 class를 사용한다.

 

함수안에 함수를 사용하게 되면 가장 바깥에서 선언된 변수는 함수 내에서는 전역변수 처럼 동작하고 함수 안의 함수에서 선언된 변수는 지역변수 처럼 동작한다.

 

아래 코드를 통해 이해해보자.

 

코드>>

 

def f_out0(a_var):
    b_var = a_var
    print(id(a_var))
    print(id(b_var))
    print(b_var)
    print("#######")

    def f_in0():
        b_var = "hi"
        print(id("hi"))
        print(id(b_var))
        print(b_var)
        print("#######")  

    def f_in1():
        print(id(a_var))
        print(id(b_var))
        print(b_var)
        print("##############")

    f_in0()    
    f_in1()

def f_out1(a_var):
    b_var = a_var
    print(id(a_var))
    print(id(b_var))
    print(b_var)
    print("#######")

    def f_in0():
        b_var = "hi"
        print(id("hi"))
        print(id(b_var))
        print(b_var)
        print("#######")
        return b_var  

    def f_in1():
        print(id(a_var))
        print(id(b_var))
        print(b_var)
        print("##############")

    b_var = f_in0()    
    f_in1()

f_out0("hello")
f_out1("hello")

 

결과>>

2120627930480
2120627930480
hello
#######
2120627929776
2120627929776
hi
#######
2120627930480
2120627930480
hello
##############
2120627930480
2120627930480
hello
#######
2120627929776
2120627929776
hi
#######
2120627930480
2120627929776
hi
##############

 

주석>>

f_out에서 선언된 값은 f_in0에서 변경을 가져도 f_in0 함수를 벗어나는 순간 원래 값으로 복귀 한다. string 뿐만 아니라 일반 변수를 적용해도 마찬가지이다.

 

만일 변경된 값을 전역적으로 유지하고 싶다면 f_out1 함수처럼 f_in0에서 변경뒤에 변경 값을 return으로 보내 주면 된다.

 

참고로 주의해야 할 부분은 변수가 list 일 경우는 append, remove로 값을 변경한 것이 전역적으로 적용 된다. 이유는 list는 변수의 메모리 위치를 가리키는 것이 아닌 list가 instance 되는 메모리 시작점을 잡기 때문이다.

 

 

 

 

반응형