묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결우리를 위한 프로그래밍 : 파이썬 중급 (Inflearn Original)
클로저 예시 함수에서 nonlocal 사용이 필요한 여부에 대해 질문드립니다.
안녕하세요. 강의 감사히 잘 듣고 있는 수강생입니다.클로저 관련 내용을 듣다 궁금한 점이 있어 질문 드립니다.해당 문제와 관련하여 다른 분들도 동일한 질문을 여러 번 올려주셨는데 "명확하게 이렇기 때문이다"라는 답변이 없이 외부 링크를 걸어주시거나 단답형으로 답변을 주셨던 것 같아 다시 질문을 드립니다.def closure_ex1(): # Free variable series = [] # 클로저 영역 def averager(v): # series = [] # 주석 해제 후 확인 series.append(v) print('inner >>> {} / {}'.format(series, len(series))) return sum(series) / len(series) return averager avg_closure1 = closure_ex1()# 잘못된 클로저 사용 def closure_ex2(): # Free variable cnt = 0 total = 0 def averager(v): cnt += 1 # cnt = cnt + 1 total += v return total / cnt return averager avg_closure2 = closure_ex2()위 두 함수 closure_ex1과 closure_ex2를 비교하면 차이는series는 list, cnt와 total은 int형 변수라는 것,averager 함수 내부에서 series는 append 작업을 하고, cnt와 total은 값을 더해주는 작업을 한다는 것입니다. 그런데 closure_ex1에서는 오류가 나지 않고, closure_ex2에서는 averager 안에 nonlocal cnt, total을 작성하지 않으면 오류가 납니다.여쭤보고 싶은 것은,[1] closure_ex1의 averager 함수 내부에 nonlocal series 라는 코드를 작성하지 않아도 되는 이유가 무엇 때문인가 입니다.closure_ex2의 averager 안에 nonlocal cnt, total 이 필요한 것은 내부 함수의 영역은 local 영역이고 closure_ex2 내부이면서 average 외부인 영역은 nonlocal 영역이기 때문에 local 영역에서 free variable을 write 작업하기 위해서는 nonlocal 변수 선언이 필요한 것으로 알고 있습니다. 하지만 series 변수에 대해서는 왜 nonlocal series 라는 코드가 필요하지 않은 것인지요?제가 추가로 공부할 링크를 주시는 것은 감사하지만, 이 질문에 대한 답변을 명확하게 댓글로 작성해주시면 감사드리겠습니다. 다른 분들의 질문에 올려 주신 링크는 모두 읽어보았습니다. 또한 명확한 답변을 주시면 공부하시는 다른 분들께도 유용할 것이라고 생각합니다. 감사합니다.ps. 강의 영상을 확인하라는 답변도 주셨었는데, 수업에서 정확하게 list나 int형 자료의 scope 별 생명 주기까지 설명한 내용은 찾지 못하였으니 만약 해당 내용이 필요하다면 강의 시간을 알려주시면 감사드리겠습니다.
-
해결됨우리를 위한 프로그래밍 : 파이썬 중급 (Inflearn Original)
클로저에서 nonlocal을 붙어야 하는 경우와 안붙여도 되는 경우 구분은?
1) 클로저 사용시, series (리스트형)의 경우는 nonlocal을 사용하지 않아도 되고, total, cnt는 nonlocal을 사용하지 않아도 되는 이유는 무엇인지요? 2) 클로저 사용시 에러없이 구현하려할때, 반드시 nonlocal을 붙여서 사용해야 하는 자료형과 nonlocal을 붙이지 않아도 되는 자료형은 어떻게 구별할 수 있는지요?
-
미해결우리를 위한 프로그래밍 : 파이썬 중급 (Inflearn Original)
series nonlocal 안해도 되는 이유
def closure_ex1():# Free variable # 클로저 영역 series = []def averager(v):# 여기는 nonlocal 안해도 되는 이유가 뭔가요?series.append(v)print(f'inner >>> {series} / {len(series)}')return sum(series) / len(series)return averageravg_closure1 = closure_ex1()print(avg_closure1(10))print(avg_closure1(20))print(avg_closure1(30)) averager 함수에서 series에 nonlocal 왜 안적어도 되는 건가요?