最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Python閉包及其作用域詳解

 更新時間:2017年08月28日 08:37:48   作者:pluviophile  
下面小編就為大家?guī)硪黄赑ython閉包及其作用域詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

關于Python作用域的知識在python作用域有相應的筆記,這個筆記是關于Python閉包及其作用域的詳細的筆記

如果在一個內部函數(shù)里,對一個外部作用域(但不是全局作用域)的變量進行引用,那么內部函數(shù)就被稱為閉包(closure),而這個被內部函數(shù)引用的變量則被成為自由變量

閉包和函數(shù)調用沒多少相關,而是關于使用定義在其他作用域的變量

命名空間和作用域

我們把命名空間看做一個大型的字典類型(Dict),里面包含了所有變量的名字和值的映射關系。在 Python 中,作用域實際上可以看做是“在當前上下文的位置,獲取命名空間變量的規(guī)則”。在 Python 代碼執(zhí)行的任意位置,都至少存在三層嵌套的作用域:

最內層作用域,最先搜索,包含所有局部變量(Python 默認所有變量聲明均為局部變量)

所有包含當前上下文的外層函數(shù)的作用域,由內而外依次搜索,這里包含的是非局部也非全局的變量

一直向上搜索,直到當前模塊的全局變量

最外層,最后搜索的,內置(built-in)變量

 scopes = {
 "local": {"locals": None,
    "non-local": {"locals": None,
       "global": {"locals": None,
         "built-in": ["built-ins"]}}},
}

除了默認的局部變量聲明方式,Python還有global和nonlocal兩種類型的聲明(nonlocal是Python3.x之后才有的),其中nonlocal是指最內層之外,global以內的變量。必須強調的是,最內層局部作用域對外層作用域的變量只有只讀(read-only)的訪問權限。比如下列的例子

x = 100
def main():
 x += 1
 print (x)
main()
UnboundLocalError Traceback (most recent call last)
<ipython-input-2-9ed43e483a17> in <module>()
  3 x += 1
  4 print(x)
----> 5 main()
<ipython-input-2-9ed43e483a17> in main()
  1 x = 100
  2 def main():
----> 3 x += 1
  4 print(x)
  5 main()
UnboundLocalError: local variable 'x' referenced before assignment

這里拋出UnboundLocalError,是因為main()函數(shù)內部的作用域對于全局變量x僅有只讀權限,想要在main()中對x進行改變,不會影響全局變量,而是會創(chuàng)建一個新的局部變量,顯然無法對還未創(chuàng)建的局部變量直接使用x += 1, 因為x未綁定到任何對象上。如果想要獲得全局變量的完全引用,則需要global聲明:

x = 100
def main():
 global x
 x += 1
 print(x)
main()
print(x) # 全局變量已被改變

# result: 
# 101
# 101

閉包

閉包和函數(shù)調用沒多少相關,而是關于使用定義在其他作用域的變量。

看了上面的Python作用域規(guī)則后,我們可以仿照JavaScript寫一個計數(shù)器的閉包:

"""
/* JavaScript Closure example */
var inc = function(){ 
 var x = 0;
 return function(){
 console.log(x++);
 };
};
var inc1 = inc()
var inc2 = inc()
"""

# Python
def inc():
 x = 0
 def inner():
  nonlocal x
  x += 1
  print(x)
 return inner
inc1 = inc()
inc2 = inc()
inc1()
inc1()
inc1()
inc2()


# result:
# 1
# 2
# 3
# 1

在這里,全局環(huán)境下不能獲取到inc()中的局部變量x的,但是我們返回了inc()內部函數(shù)inner(),而inner()對inc()中的局部變量是有訪問權限的。也就是說inner()將inc()局部作用域打包發(fā)送給了inc1和 inc2,從而使他們各自獨立擁有了一塊封閉起來的作用域,不受其他運行環(huán)境和全局變量的影響,因此稱之為閉包。

上述代碼中inc1和inc2各自有一塊封閉起來的作用域,可以通過Online Python Tutor 可視化運行工具看相應的運行結果

這篇基于Python閉包及其作用域詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

最新評論

彭水| 荔浦县| 普洱| 德江县| 将乐县| 庆安县| 乾安县| 岢岚县| 景宁| 精河县| 陆丰市| 车致| 娄烦县| 轮台县| 蕉岭县| 南江县| 乳山市| 惠东县| 巴彦淖尔市| 新竹市| 扶沟县| 普陀区| 卓资县| 新宁县| 尉氏县| 姚安县| 扶余县| 邵阳市| 浦北县| 清流县| 保靖县| 洮南市| 新乡市| 广安市| 麦盖提县| 泉州市| 保山市| 深州市| 余姚市| 滨州市| 洪江市|