컴퓨터 과학에서 클로저(Closure)는 렉시컬 클로저(Lexical Closure)의 약자로 자유변수를 참조하는 함수이다. 참조된 자유 변수는 그것이 생성된 환경을 떠난 후에도 함수에 남아 있습니다. 따라서 클로저는 함수와 관련 참조 환경으로 구성된 엔터티라고 말하는 또 다른 방법이 있습니다. 클로저는 런타임에 여러 인스턴스를 가질 수 있으며, 서로 다른 참조 환경과 동일한 함수 조합이 서로 다른 인스턴스를 생성할 수 있습니다.
저는 클로저를 코드 구성을 위한 구조로 보는 후자를 선호합니다. 이유는 나중에 설명하겠습니다.
클로저 코드의 구조는 어떻게 되나요?
Python에서는 모든 것이 객체이며 물론 함수도 포함됩니다. 함수 개체는 변수에 할당될 수 있으며, 이 변수를 통해 함수를 호출할 수 있습니다. 함수 개체는 매개 변수로 전달될 수도 있고 함수의 반환 결과로 사용될 수도 있습니다. 또한 Python에서는 함수를 중첩할 수 있습니다.
Python은 함수 객체를 기반으로 하며 클로저의 문법적 구조를 지원합니다
먼저 예제를 살펴보겠습니다
def f1(): name1 = 'Alice' name2 = 'Bob' def f2(): print('hello,%s,%s' %(name1,name2)) return f2 if __name__ == '__main__': name1 = 'David' name2 = 'Frank' func = f1() func() print(func.__closure__) print(func.__closure__[0].cell_contents) print(func.__closure__[1].cell_contents)# 输出hello,Alice,Bob (<cell at 0x03A55CF0: str object at 0x03CBEA20>, <cell at 0x03CBEAD0: str object at 0x03CBEAA0>) Alice Bob
함수 f2는 함수 f1 내부에 정의되어 있으며 f1에 정의된 변수 name1 및 name2가 제거됩니다.
f1은 함수 개체 f2를 반환하지만 실제로 반환된 f2에는 f1의 변수 name1 및 name2가 이미 포함되어 있으며 이는 코드 실행 결과에서 볼 수 있습니다.
메인 프로그램에서 name1과 name2를 재정의하더라도 func 함수가 실행될 때의 변수 값은 정의될 때 여전히 호출됩니다. 즉, 참조 환경 변수가 호출될 때의 변수 값이 아닙니다. 사용된.
요약하자면 Python에서 클로저는 함수와 참조되는 환경 변수를 포함하는 코드 블록입니다. 저는 클로저를 함수라기보다는 코드 구조로 생각하는 경향이 있습니다. 클로저의 참조 환경과 내부 함수를 함께 래핑하고 내부 함수를 실행하지 않고 함수 객체로 반환합니다. 이 함수 객체가 호출되면 내부 함수 함수가 실행됩니다.
참조된 환경 변수의 값은 함수 객체의 클로저 속성에 저장됩니다. 클로저에는 튜플이 포함되어 있습니다. 이 튜플의 각 요소는 셀 유형의 객체입니다. 첫 번째 셀에는 클로저를 생성할 때 환경 변수 name1의 값인 Alice가 포함되어 있는 것을 볼 수 있습니다. 이는 위 코드의 결과를 보면 알 수 있습니다.
이제 백과사전에서 클로저에 대한 설명을 다시 살펴보세요.
이제 또 다른 예를 들어보겠습니다.
# 此例子转自伯乐在线def line_def(a, b): def line(x): return a * x + b return lineif __name__ == '__main__': func = line_def(2, 3) print(func(5))# 输出13
이 예에서는 함수 라인과 환경 변수 a, b가 클로저를 형성합니다. a의 값만 변경하면 됩니다. , b를 얻으려면 다양한 직선 함수가 캡슐화를 개선하므로 매개변수 a와 b에만 주의하면 되고 내부 직선의 구현에는 신경 쓰지 않아도 됩니다.
클로저의 가장 큰 특징은 외부 함수의 변수를 내부 함수에 바인딩하고, 이때 변수(즉, 클로저)를 바인딩한 후 함수를 반환할 수 있다는 점입니다. 클로저가 생성된(외부 함수)이 해제되었더라도 클로저는 여전히 존재합니다.
클로저의 주요 응용 분야는 데코레이터이지만 기능을 전달합니다. 이건 다음에 쓰겠습니다.
위 내용은 Python 클로저에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!