• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

잘못된 클로저 사용 예시에서 궁금한 점이 있습니다.

20.05.04 12:33 작성 조회수 136

0

리스트인 series처럼 cnt, total도 자유 변수로 선언한 것인데

cnt, total만 할당 전에 참조되었단 오류가 뜹니다.

그럼 series를 사용한 예시에서

series.append(v) 는 '참조'가 아닌 건가요?

내용이 정리되지 않아 한 번 여쭤봅니다. 

답변 5

·

답변을 작성해보세요.

1

마지막으로 여기 블로그도 읽어보세요

https://shoark7.github.io/programming/python/closure-in-python

1

def count(x):
    def increment():
        x += 1
        print(x)

    increment()


>>> count(5)

UnboundLocalError: local variable 'x' referenced before assignment

1

네 이해했습니다.

nonlocal 과 global 차이를 정확하게 이해하시면 됩니다.

아래 블로그가 정말 자세하게 나와 있습니다. 

https://devbruce.github.io/python/py-13-global,nonlocal/

0

def closure_ex1():

    series = []

    def averager(v):

        series.append(v)

        print(f'입력된 값>> {series} / {len(series)}')

        return sum(series) / len(series)

    return averager

ex = closure_ex1()

print(ex(3))

print(ex(5))

먼저 자유 변수로 series란 리스트를 사용해 값을 누적해 평균을 구하고자 한 방법입니다.

def closure_ex2():

    cnt = 0

    total = 0

    def averager(v):

        cnt += 1

        total += v

        print(f'입력 값 >> {total} / {cnt}')

        return total/cnt

    return averager

ex2 = closure_ex2()

print(ex2(3))

print(ex2(5))

그리고 cnt, total이란 자유 변수를 사용해 값을 누적해 평균을 구하고자 한 방법입니다.

제가 자유 변수를 이해한 바로는

바깥 함수에서 정의된 변수를 안쪽의 함수가 사용하는 경우로, 값을 변경하지 않을 경우 UnboundLocalError 오류가 발생하지 않습니다. 

(이해한 바가 잘못되었다면 알려주세요.)

두 번째 경우에서만 할당 전에 참조되었다는 UnboundLocalError 오류가 나는 것은

안쪽의 함수, 즉 averager 함수 내에서 자유 변수인 cnt의 값을 변경하였기 때문인가요?(cnt += 1 부분)

그래서 nonlocal cnt, total로 선언하여 averager 함수의 지역 변수가 아니라는 것을 알려주는 건가요?

만약 자유 변수로 선언한 cnt의 값을 변경하였기 때문에 오류가 나는 것이 맞다면

series란 리스트를 사용한 방법의 경우는 series.append()하여 리스트에 데이터를 추가하였지만 이것이 값을 변경하는 의미는 아닌 건가요?

질문이 길어졌네요^_^;;; 

series 리스트를 사용한 방식과 다르게 cnt, total 이란 변수를 선언해 재할당하는 방법에서만 오류가 나는 이유를 아직 명확하게 이해하지 못해 질문드립니다.

0

질문 내용이 이해가 가질 않네요.

전체 예제 소스코드 부분을 빠짐없이 붙여넣어 주세요!