22.01.03 17:30 작성
·
281
0
안녕하세요? 현재 파이썬 Level2 강의 중 파이썬 일급함수챕터 중 클로저 부분을 수강중입니다.
좀 찾아보면서 헷갈리는 개념이 있어서 질문드립니다.
1. 선생님 강의 + 좀 더 찾아보니 파이썬에는 global / nonlocal / local 영역이 있더군요.
전역변수의 값은 일반적으로 메모리에 보존되는 반면 나머지 nonlocal이나 local 변수들은 함수가 종료되면 변수가 삭제되는게 일반적인 법칙입니다.
하지만 클로저는 그러한 일반적 법칙의 한계를 넘어서 함수가 종료되어도 nonlocal / local 값들을 계속해서 기억하고 있다
고 스스로 정리했는데, 혹시 이게 정확하게 맞는지 알고싶습니다.
2. 선생님의 클로저와 강의 중 클래스를 사용하여 클로저와 비슷하게 구현하신 내용이 있습니다
요부분 인데요, 이 클래스를 활용해서 인스턴스를 생성하고 계속해서 호출을 했을 때 값이 소멸하지 않고 유지되더군요. 그 이유가 궁금합니다.
self._series도 전역/지역변수를 공부하고나서 보니까 지역변수에 해당하는 것 같은데 지워지지 않는게 이상하게 느껴져서요.
아니면 혹시 클래스에 의해 만들어진 객체의 모든 값들(self._series 같은 것들도)은 객체가 유지되는 한 함께 보존되는 것인가요? 그래서 마치 클로저 같은 역할을 하는 것인지 궁금합니다.(쓰다보니 그런것같기도하네요 ㅋㅋㅋ..)
3. 마지막으로 nonlocal에 관해서입니다.
1)
2)
1)에는 자유변수로 리스트를 선언했고, 2)에서는 자유변수로 그냥 변수(total같은 것들)를 선언했는데요
2)의 경우에 nonlocal을 붙여주더라구요
이거랑 비슷한 질문을 하신분들이 계셔서 그 답변들을 좀 찾아보면서 좀 정리를 했는데요, 제가 이해한 부분이 맞는지 확인을 받을 수 있을까요? 생소한 개념들이 막튀어 나오다보니까 혼자 정리를 하고서도 맞는지를 모르겠습니다 ㅠㅠ
A :
- 파이썬은 일반적으로 local영역을 넘어서는 다른 영역의 변수에 대해서는 읽거나 참조를 할 뿐, 수정이나 새로이 할당을 하는 것이 제한한다. 더 자세히 말하면, 제한하기 위하여 별다른 선언(nonlocal, global)등이 없으면 무조건 local영역내의 변수에 관한것이라고 전제한다.
- 리스트나 dict의 경우 mutable하며 요소를 추가해주거나(특히 append를 활용하여) 할때 메모리 주소가 바뀌지 않음. 즉 읽거나 참조하는 것이므로 이러한 과정은 허용
-하지만 일반적인 변수는 immutbale하므로 값을 변환해주었을 경우 ID값이 교체되며 완전히 새로운 값이 되며 이는 허용된 권한을 넘는 것
-이에따라 파이썬은 새로이 수정되는 변수가 무조건 local영역내의 변수라고 전제함.
-파이썬의 이러한 전제를 제거(?)하기위해 nonlocal을 선언해줘서, nonlocal영역에 위치한 변수를 내부 변수(여기선 averager)에서 사용할 수 있게 함
다적고 보니.. 질문이 너무 많네요 좋은 강의에 감사드립니다.
답변 2
-1
2022. 01. 04. 08:48
전체적으로 질문이 많아 핵심적인것만 답변드릴께여!
클로저의 특성 -> 클로저란 내부함수가 외부함수의 지역변수에 접근 할 수 있고, 외부함수는 외부함수의 지역변수를 사용하는 내부함수가 소멸될 때까지 소멸되지 않는 특성을 의미한다
위 부분만 기억하시면 됩니다.
이는 타 언어의 클로저 특성과 어느정도 일치합니다.
전체적인 질문의 맥락이 클로저의 특성과 연관되어 있어서 대표해서 답변드려여