国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

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

2020-01-04 16:49:45
字體:
來源:轉載
供稿:網友

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

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

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

命名空間和作用域

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

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

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

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

最外層,最后搜索的,內置(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 = 100def 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()函數內部的作用域對于全局變量x僅有只讀權限,想要在main()中對x進行改變,不會影響全局變量,而是會創建一個新的局部變量,顯然無法對還未創建的局部變量直接使用x += 1, 因為x未綁定到任何對象上。如果想要獲得全局變量的完全引用,則需要global聲明:

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

閉包

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

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

"""/* JavaScript Closure example */var inc = function(){  var x = 0; return function(){ console.log(x++); };};var inc1 = inc()var inc2 = inc()"""# Pythondef inc(): x = 0 def inner():  nonlocal x  x += 1  print(x) return innerinc1 = inc()inc2 = inc()inc1()inc1()inc1()inc2()# result:# 1# 2# 3# 1

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

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

閉包,作用域,Python

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 旬邑县| 晋城| 石屏县| 清丰县| 安岳县| 屏南县| 台中县| 外汇| 河源市| 清原| 中西区| 石门县| 遂溪县| 上高县| 乌兰浩特市| 湾仔区| 宜城市| 望江县| 抚顺县| 迭部县| 岐山县| 江阴市| 巴南区| 阳泉市| 公安县| 都匀市| 湟源县| 彰化市| 兰州市| 东海县| 东阿县| 永新县| 静安区| 永平县| 奉节县| 常山县| 岳池县| 甘肃省| 论坛| 齐齐哈尔市| 民乐县|