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

首頁 > 編程 > Python > 正文

Python編程中運用閉包時所需要注意的一些地方

2020-02-23 01:01:17
字體:
來源:轉載
供稿:網(wǎng)友

寫下這篇博客,起源于Tornado郵件群組的這個問題how to use outer variable in inner method,這里面老外的回答很有參考價值,關鍵點基本都說到了。我在這里用一些有趣的例子來做些解析,簡要的闡述下Python的閉包規(guī)則,首先看一個經(jīng)典的例子:

def foo(): a = 1 def bar():  a = a + 1  # print a + 1  # b = a + 1  # a = 1  print id(a)  bar() print a, id(a)

在Python2.x上運行這個函數(shù)會報UnboundLocalError: local variable 'a' referenced before assignment即本地變量在引用前未定義,如何來理解這個錯誤呢?PEP 227里面介紹到,Python解析器在搜索一個變量的定義時是根據(jù)如下三級規(guī)則來查找的:

    The Python 2.0 definition specifies exactly three namespaces to check for each name — the local namespace, the global namespace, and the builtin namespace.

這里的local實際上可能還有多級,上面的代碼就是一個例子,下面通過對代碼做些簡單的修改來一步步理解這里面的規(guī)律:

    如果將a = a + 1這句換成print a + 1或者b = a + 1,是不會有問題的,即在內部函數(shù)bar內,外部函數(shù)foo里的a實際是可見的,可以引用。     將a = a + 1換成 a = 1也是沒有問題的,但是如果你將兩處出現(xiàn)的a的id打印出來你會發(fā)現(xiàn),其實這兩個a不是一回事,在內部函數(shù)bar里面,本地的a = 1定義了在bar函數(shù)范圍內的新的一個局部變量,因為名字和外部函數(shù)foo里面的變量a名字相同,導致外部函數(shù)foo里的a在內部函數(shù)bar里實際已不可見。     再來說a = a + 1出錯是怎么回事,首先a = xxx這種形式,Python解析器認為要在內部函數(shù)bar內創(chuàng)建一個新的局部變量a,同時外部函數(shù)foo里的a在bar里已不可見,而解析器對接下來對右邊的a + 1的解析就是用本地的變量a加1,而這時左邊的a即本地的變量a還沒有創(chuàng)建(等右邊賦值呢),因此就這就產(chǎn)生了一個是雞生蛋還是蛋生雞的問題,導致了上面說的UnboundLocalError的錯誤。

要解決這個問題,在Python2.x里主要有兩個方案:

    用別名替代比如b = a + 1,內部函數(shù)bar內只引用外部函數(shù)foo里的a。
    將foo里的a設成一個容器,如list

  

 def foo():  a = [1, ]  def bar():   a[0] = a[0] + 1    bar()  print a[0]

當然這有些時候還是很不方便,因此在Python3.x中引入了一個nonloacal的關鍵字來解決這個問題,只要在a = a + 1前加一句nonloacal a即可,即顯式的指定a不是內部函數(shù)bar內的本地變量,這樣就可以在bar內正常的使用和再賦值外部函數(shù)foo內的變量a了。

在搜索Python閉包相關的材料中,我在StackOverflow上發(fā)現(xiàn)一個有趣的有關Python閉包的問題,有興趣的可以思考思考做做看,結果應該是什么?你預期的結果是什么,若不一致,如果要得到你預期的結果應該怎么改?

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 米林县| 辉南县| 萝北县| 同仁县| 思南县| 得荣县| 梅河口市| 阿荣旗| 岳普湖县| 柳州市| 景谷| 阿巴嘎旗| 民乐县| 台东县| 宁晋县| 安泽县| 邮箱| 山西省| 双江| 福建省| 双城市| 远安县| 土默特左旗| 苍溪县| 黑山县| 昭平县| 离岛区| 青海省| 卓尼县| 湖州市| 莱阳市| 秭归县| 大渡口区| 崇信县| 永川市| 卓资县| 绍兴县| 日照市| 昂仁县| 平遥县| 尉氏县|