잘못된 클로저 사용 예시에서 궁금한 점이 있습니다.
296
작성한 질문수 4
리스트인 series처럼 cnt, total도 자유 변수로 선언한 것인데
cnt, total만 할당 전에 참조되었단 오류가 뜹니다.
그럼 series를 사용한 예시에서
series.append(v) 는 '참조'가 아닌 건가요?
내용이 정리되지 않아 한 번 여쭤봅니다.
답변 5
1
def count(x):
def increment():
x += 1
print(x)
increment()
>>> count(5)
UnboundLocalError: local variable 'x' referenced before assignment
1
네 이해했습니다.
nonlocal 과 global 차이를 정확하게 이해하시면 됩니다.
아래 블로그가 정말 자세하게 나와 있습니다.
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
41
1
RuntimeError: There is no current event loop in thread 'MainThread'
0
84
1
chapter 07-01 실행 오류
0
67
1
Chapter05-04 : sum_func의 합이 이중 출력됩니다.
0
78
2
45. 병렬성 2 - Futures(5-1) wait가 의도된 대로 동작하지 않습니다.
0
93
2
멀티스레딩 - 44. 병렬성 1 - Futures(4-2)
0
71
2
chapter05_02 클로저 질문사항 !
0
53
1
LV1 설정
0
88
2
매직 메소드의 호출 방법 차이 문의
0
133
2
왜 numbers리스트를 만들때 str으로 숫자를 감싸나요?
0
96
2
스크랩핑 실습 중 Mac OS 인증서 문제
0
129
1
AsyncIO 멀티 스크랩핑 실습 예제 관련 질문
0
168
1
강의자료가 영상과 다릅니다
0
256
2
closure.cell_contents 초기화 하기 문의
0
131
2
map함수 사용 시, list변환 방법 문의
0
336
2
__mul__ 백터 * 숫지, 백터 * 백터 처리
0
144
1
del처리후 질문입니다.
0
154
1
car_list(car1,car2,car3) 인스턴스 tuple 타입 문의
0
224
1
coroutine에 대한 질문
0
243
1
제너레이터 이터레이터 질문이 있습니다.
0
250
1
atom install package search not working
0
277
1
Magic Method - Not Implemented
0
399
1
가상환경 질문!
0
404
1
병렬처리 추가 질문이 있습니다.
0
246
1





