在一些語言中,在函式中可以(巢狀)定義另乙個函式時,如果內部的函式引用了外部的函式的變數,則可能產生閉包。閉包可以用來在乙個函式與一組「私有」變數之間建立關聯關係。在給定函式被多次呼叫的過程中,這些私有變數能夠保持其永續性。——維基百科簡而言之, 閉包的特點就是內部函式引用了外部函式中的變數。 在python中,支援將函式當做物件使用,也就是可以將乙個函式當做普通變數一樣用作另乙個函式的引數和返回值。擁有此類特性的語言,一般都支援閉包。
閉包中被內部函式引用的變數,不會因為外部函式結束而被釋放掉,而是一直存在記憶體中,知道內部函式被呼叫結束。
示例:定義y=2x +6
def line_config(a,b):
def line(x):
return a*x+b
return line
line=line_config(2,6)
print(line(2))
結果:
f:\python\001code\bigdata\venv\scripts\python.exe f:/python/001code/bigdata/venv/closure.py
10process finished with exit code 0
函式名.__closure__ 在函式是閉包函式時,返回乙個cell元素;不是閉包時,返回none。
輸出cell:
def func():
name = 'python'
def inner():
print(name)
print(inner.__closure__) # (,)
return inner
f = func()
f()
輸出none:
name = 'python'
def func():
def inner():
print(name)
print(inner.__closure__) # none
return inner
f = func()
f()
閉包 函式 作用域
指有權訪問另乙個函式作用域中的變數的函式 要理解閉包就必須要了解作用域鏈 後台的每個執行環境都有乙個表示變數的物件 變數物件。全部變數物件始終都存在 而像compare 函式這樣的區域性環境的變數物件,則只在函式執行的過程中存在 在建立compare 函式的時候,會建立乙個預先包括全域性變數物件的作...
作用域與閉包
執行上下文 範圍 一段或者乙個函式 全域性 變數定義 函式宣告 一段 函式 變數定義 函式宣告 this arguments 函式 ps 注意 函式宣告 和 函式表示式 的區別 console.log a var a 100 fn zhangsan function fn name this thi...
作用域與閉包
變數存在並產生作用的環境上下文。在es5規範中只有兩種作用域 函式可以巢狀,而每個函式都有自己的作用域,當進入乙個函式的時候,函式環境就會被壓入乙個環境棧當中,當函式執行完畢之後又會出棧,將控制權轉交給外面一層的函式。內部呼叫外部 var a 3 function add add console.l...