>  기사  >  백엔드 개발  >  파이썬 클로저란 무엇입니까? Python 클로저에 대한 간략한 소개(예제 포함)

파이썬 클로저란 무엇입니까? Python 클로저에 대한 간략한 소개(예제 포함)

不言
不言앞으로
2018-10-09 16:51:412795검색

이 기사에서는 Python 클로저가 무엇인지 설명합니다. Python 클로저에 대한 간략한 소개(예제 포함)에는 특정 참고 가치가 있습니다. 도움이 필요한 친구가 참고할 수 있기를 바랍니다.

폐쇄란 무엇인가요?

사실 함수를 사용할 때 실수로 클로저가 실행됩니다. 어떤 이유에서인지 상위 레이어 함수의 변수는 항상 함수 내에서 참조되거나 수정되기 때문입니다.

그럼 클로저란 무엇인가요? 실제로 함수가 중첩될 때 발생하는 규칙인데, 이 규칙은 현재 함수가 이전 함수의 로컬 네임스페이스에 있는 변수를 참조하고 함수 자체가 객체로 반환될 때 발생합니다.
클로저를 발생시키는 함수를 클로저 함수라고 합니다

클로저의 가장 큰 특징은 외부 함수에 의해 반환된 후 변수에 할당될 수 있다는 점이며, 외부 함수의 내용을 전달합니다. 정의된 변수

의 예는 다음과 같습니다.

def func1():
    a = 2  #变量a为函数func1()开辟的局部命名空间内定义的变量
    def func2(x):
        return x**a  #函数fun2()内引用了变量a
    print('func2的id:',id(func2))
    return func2 #内层函数名被当作返回值,此时闭包规则达成。
res = func1() # 此时res等同于func2,我们可以看看他们的id完全相同
print('res的id:  ',id(res))
print(res(3))
del func1
print('删除函数func1之后:',res(5))
print(res.__closure__) 
print(type(res.__closure__[0])) 
print(res.__closure__[0].cell_contents) 
#此时,如果函数func2()没有引用外部函数变量a,我们可以试着把return x**a这句改成return x,这时函数func2就没有触发闭包规则
#此时如果再次打印res.__closure__,你会发现输出值为None

아래 출력 결과에서 볼 수 있듯이 func1 함수가 삭제되더라도 이론적으로 사라져야 할 변수 a는 계속 사용할 수 있습니다(이론적으로 a에 해당하는 로컬 공간이 사라지면 a는 사라져야 합니다). 변수 a를 계속 참조할 수 있는 이유는 로컬 변수 때문입니다. 외부 함수가 반환된 경우에도 내부 함수에서 외부 함수를 참조할 수 있습니다.
사실 함수 자체도 객체이고 객체에는 많은 속성이 있는데, 그 중 클로저와 관련된 속성이 closure 속성입니다.
closure 속성은 셀 개체를 포함하는 튜플을 정의합니다. 여기서 튜플의 각 셀 개체는 범위의 변수 값을 저장하는 데 사용됩니다.

func2的id: 139940709362136
res的id:   139940709362136
9
删除函数func1之后: 25
#我们来打印一下res的__closure__属性,可以看出它是由cell对象组成的元组
(<cell at 0x7f467c4a8558: int object at 0x5654c2553a40>,)
<class &#39;cell&#39;> #打印类型结果就是元组
2  #打印cell中的值可以看出,这个cell对象中存储的变量值为2

클로저를 실행한 후 로컬 공간에 의존하지 않고 상위 로컬 네임스페이스 변수를 참조하는 것이 가능합니다. 변수가 위치한 함수가 삭제되더라도 클로저 함수는 계속 작동할 수 있습니다. 실제로 클로저 함수는 이를 __closure__ 속성에 저장합니다.

위 내용은 파이썬 클로저란 무엇입니까? Python 클로저에 대한 간략한 소개(예제 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제