강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

주니어부기님의 프로필 이미지
주니어부기

작성한 질문수

우리를 위한 프로그래밍 : 파이썬 중급 (Inflearn Original)

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

작성

·

283

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

좋은사람님의 프로필 이미지
좋은사람
지식공유자

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

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

주니어부기님의 프로필 이미지
주니어부기

작성한 질문수

질문하기