亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Python中的作用域規則詳解

系統 1626 0

Python是靜態作用域語言,盡管它自身是一個動態語言。也就是說,在Python中變量的作用域是由它在源代碼中的位置決定的,這與C有些相似,但是Python與C在作用域方面的差異還是非常明顯的。

接下來會談論Python的作用域規則,在這中間也會說明一下Python與C在作用域方面的不同。

在Python 2.0及之前的版本中,Python只支持3種作用域,即局部作用域,全局作用域,內置作用域;在Python 2.2中,Python正式引入了一種新的作用域 --- 嵌套作用域;在Python 2.1中,嵌套作用域可以作為一個選項被開啟;嵌套作用域的引入,本質上為Python實現了對閉包的支持,關于閉包的知識,網上有很多解釋,這里就不詳細展開了。相應地,變量查找順序由之前的LGB變成LEGB(L:Local,E:Enclosing,G:Global,B:Built-in)。

在Python中,并不是任何代碼塊都能引入新的作用域,這與C有很大的不同:

復制代碼 代碼如下:

#include
int main() {
??? if(2 > 0) {
??????? int i = 0;
??? }
??? printf("i = %d", i);
??? return 0;
}

在這段代碼中,if子句引入了一個局部作用域,變量i就存在于這個局部作用域中,但對外不可見,因此,接下來在printf函數中對變量i的引用會引發編譯錯誤。

但是,在Python中卻并非如此:

復制代碼 代碼如下:

if True:
??? i = 0
print i

?在這段代碼中,if子句并沒有引入一個局部作用域,變量i仍然處在全局作用域中,因此,變量i對于接下來的print語句是可見的。

實際上,在Python中,只有模塊,類以及函數才會引入新的作用域,其它的代碼塊是不會引入新的作用域的。

在Python中,使用一個變量之前不必預先聲明它,但是在真正使用它之前,它必須已經綁定到某個對象;而名字綁定將在當前作用域中引入新的變量,同時屏蔽外層作用域中的同名變量,不論這個名字綁定發生在當前作用域中的哪個位置。

復制代碼 代碼如下:

def f():
??? print i
f()

運行結果將顯示:NameError: global name 'i' is not defined。Python首先在函數f的本地作用域中查找變量i,查找失敗,接著在全局作用域和內置作用域中查找變量i,仍然失敗,最終拋出NameError異常。

復制代碼 代碼如下:

i = 0
def f():
??? i = 8
??? print i
f()
print i

運行結果顯示:8和0。i = 8是一個名字綁定操作,它在函數f的局部作用域中引入了新的變量i,屏蔽了全局變量i,因此f內部的print語句看到的是局部變量i,f外部的print語句看到的是全局變量i。

復制代碼 代碼如下:

i = 0
def f():
??? print i
??? i = 0
f()

運行結果顯示:UnboundLocalError: local variable 'i' referenced before assignment。在這個例子當中,函數f中的變量i是局部變量,但是在print語句使用它的時候,它還未被綁定到任何對象之上,所以拋出異常。

復制代碼 代碼如下:

print i
i = 0

不論是以交互的方式運行,還是以腳本文件的方式運行,結果都顯示:NameError: name 'i' is not defined。這里的輸出結果又與上一個例子不同,這是因為它在頂級作用域(模塊作用域)的緣故。對于模塊代碼而言,代碼在執行之前,沒有經過什么預處理,但是對于函數體而言,代碼在運行之前已經經過了一個預處理,因此不論名字綁定發生在作用域的那個位置,它都能感知出來。Python雖然是一個靜態作用域語言,但是名字查找確實動態發生的,因此直到運行的時候,才會發現名字方面的問題。

在Python中,名字綁定在所屬作用域中引入新的變量,同時綁定到一個對象。名字綁定發生在以下幾種情況之下:

1.參數聲明:參數聲明在函數的局部作用域中引入新的變量;
2.賦值操作:對一個變量進行初次賦值會在當前作用域中引入新的變量,后續賦值操作則會重新綁定該變量;
3.類和函數定義:類和函數定義將類名和函數名作為變量引入當前作用域,類體和函數體將形成另外一個作用域;
4.import語句:import語句在當前作用域中引入新的變量,一般是在全局作用域;
5.for語句:for語句在當前作用域中引入新的變量(循環變量);
6.except語句:except語句在當前作用域中引入新的變量(異常對象)。

在Python中,類定義所引入的作用域對于成員函數是不可見的,這與C++或者Java是很不同的,因此在Python中,成員函數想要引用類體定義的變量,必須通過self或者類名來引用它。

嵌套作用域的加入,會導致一些代碼編譯不過或者得到不同的運行結果,在這里Python解釋器會幫助你識別這些可能引起問題的地方,給出警告。

locals函數返回所有的局部變量,但是不會返回嵌套作用域中的變量,實際上沒有函數會返回嵌套作用域中的變量。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 日本一级在线观看 | a级毛片在线观看 | 日本一区二区三区四区 | 亚洲视频在线观看一区 | 久久综合九色综合欧洲 | 中文字幕一二三区乱码老 | 国产一级毛片外aaaa | 国产图片区 | 欧美中文字幕一二三四区 | 91婷婷色 | 午夜看毛片 | 国内精品久久久久久影院网站小说 | 中文字幕 国产精品 | 奇米青青草 | 亚洲精品视| 国产农村精品一级毛片视频 | 私人影院免费 | 99在线观看视频免费精品9 | 亚洲最大网 | 最新国产网站 | 美国一级毛片片aa久久综合 | 成人黄色一级片 | 亚洲色欲色欲www | 日韩一区二区不卡中文字幕 | 亚洲欧美日韩综合二区三区 | 综合伊人久久在一二三区 | 四虎四虎 | 久久精品视频免费播放 | 伊伊综合 | 亚洲激情在线看 | 中文字幕久精品免费视频 | 在线欧美精品国产综合五月 | 久久九色| 午夜精品久久久久久毛片 | 香蕉免费一级视频在线观看 | a视频在线观看 | 在线播放国产精品 | 久久我们这里只有精品国产4 | 五月天婷婷在线视频 | 久久一区视频 | 台湾佬中文娱乐2222vvv |