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

Python中的作用域規(guī)則詳解

 更新時(shí)間:2015年01月30日 09:03:50   投稿:junjie  
這篇文章主要介紹了Python中的作用域規(guī)則詳解了局部作用域、全局作用域、內(nèi)置作用域、嵌套作用域等內(nèi)容,本文講解了,需要的朋友可以參考下

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

接下來會(huì)談?wù)揚(yáng)ython的作用域規(guī)則,在這中間也會(huì)說明一下Python與C在作用域方面的不同。

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

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

復(fù)制代碼 代碼如下:

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

在這段代碼中,if子句引入了一個(gè)局部作用域,變量i就存在于這個(gè)局部作用域中,但對(duì)外不可見,因此,接下來在printf函數(shù)中對(duì)變量i的引用會(huì)引發(fā)編譯錯(cuò)誤。

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

復(fù)制代碼 代碼如下:

if True:
    i = 0
print i

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

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

在Python中,使用一個(gè)變量之前不必預(yù)先聲明它,但是在真正使用它之前,它必須已經(jīng)綁定到某個(gè)對(duì)象;而名字綁定將在當(dāng)前作用域中引入新的變量,同時(shí)屏蔽外層作用域中的同名變量,不論這個(gè)名字綁定發(fā)生在當(dāng)前作用域中的哪個(gè)位置。

復(fù)制代碼 代碼如下:

def f():
    print i
f()

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

復(fù)制代碼 代碼如下:

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

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

復(fù)制代碼 代碼如下:

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

運(yùn)行結(jié)果顯示:UnboundLocalError: local variable 'i' referenced before assignment。在這個(gè)例子當(dāng)中,函數(shù)f中的變量i是局部變量,但是在print語(yǔ)句使用它的時(shí)候,它還未被綁定到任何對(duì)象之上,所以拋出異常。

復(fù)制代碼 代碼如下:

print i
i = 0

不論是以交互的方式運(yùn)行,還是以腳本文件的方式運(yùn)行,結(jié)果都顯示:NameError: name 'i' is not defined。這里的輸出結(jié)果又與上一個(gè)例子不同,這是因?yàn)樗陧敿?jí)作用域(模塊作用域)的緣故。對(duì)于模塊代碼而言,代碼在執(zhí)行之前,沒有經(jīng)過什么預(yù)處理,但是對(duì)于函數(shù)體而言,代碼在運(yùn)行之前已經(jīng)經(jīng)過了一個(gè)預(yù)處理,因此不論名字綁定發(fā)生在作用域的那個(gè)位置,它都能感知出來。Python雖然是一個(gè)靜態(tài)作用域語(yǔ)言,但是名字查找確實(shí)動(dòng)態(tài)發(fā)生的,因此直到運(yùn)行的時(shí)候,才會(huì)發(fā)現(xiàn)名字方面的問題。

在Python中,名字綁定在所屬作用域中引入新的變量,同時(shí)綁定到一個(gè)對(duì)象。名字綁定發(fā)生在以下幾種情況之下:

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

在Python中,類定義所引入的作用域?qū)τ诔蓡T函數(shù)是不可見的,這與C++或者Java是很不同的,因此在Python中,成員函數(shù)想要引用類體定義的變量,必須通過self或者類名來引用它。

嵌套作用域的加入,會(huì)導(dǎo)致一些代碼編譯不過或者得到不同的運(yùn)行結(jié)果,在這里Python解釋器會(huì)幫助你識(shí)別這些可能引起問題的地方,給出警告。

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

相關(guān)文章

  • Python中遇到的小問題及解決方法匯總

    Python中遇到的小問題及解決方法匯總

    到年底了,現(xiàn)在的時(shí)間適合寫點(diǎn)最近的小總結(jié),所以下面這篇文章主要介紹了Python中遇到的一些小問題及解決方法,需要的朋友可以參考借鑒,下面來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-01-01
  • Python實(shí)現(xiàn)的讀寫json文件功能示例

    Python實(shí)現(xiàn)的讀寫json文件功能示例

    這篇文章主要介紹了Python實(shí)現(xiàn)的讀寫json文件功能,結(jié)合實(shí)例形式分析了Python針對(duì)json文件進(jìn)行讀寫的常見操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2018-06-06
  • 使用Python實(shí)現(xiàn)繪制發(fā)散條形圖

    使用Python實(shí)現(xiàn)繪制發(fā)散條形圖

    發(fā)散條形圖用于簡(jiǎn)化多個(gè)組的比較,它許我們比較各組中的數(shù)值,還幫助我們快速地想象出有利的和不利的或積極的和消極的反應(yīng),下面我們就來看看如何使用Python繪制發(fā)散條形圖吧
    2024-04-04
  • 如何用OpenCV -python3實(shí)現(xiàn)視頻物體追蹤

    如何用OpenCV -python3實(shí)現(xiàn)視頻物體追蹤

    OpenCV是一個(gè)基于BSD許可(開源)發(fā)行的跨平臺(tái)計(jì)算機(jī)視覺庫(kù),可以運(yùn)行在Linux、Windows、Android和Mac OS操作系統(tǒng)上。這篇文章主要介紹了如何用OpenCV -python3實(shí)現(xiàn)視頻物體追蹤,需要的朋友可以參考下
    2019-12-12
  • pydev debugger: process 10341 is connecting無法debu的解決

    pydev debugger: process 10341 is co

    這篇文章主要介紹了pydev debugger: process 10341 is connecting無法debu的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 小白如何入門Python? 制作一個(gè)網(wǎng)站為例

    小白如何入門Python? 制作一個(gè)網(wǎng)站為例

    以制作一個(gè)網(wǎng)站為例,聊一聊小白如何入門Python,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • 一篇文章弄懂Python中的內(nèi)建函數(shù)

    一篇文章弄懂Python中的內(nèi)建函數(shù)

    Python學(xué)習(xí),內(nèi)建函數(shù)是你必須要掌握的一部分,下面這篇文章主要給大家介紹了關(guān)于Python中內(nèi)建函數(shù)的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2021-08-08
  • Python實(shí)現(xiàn)爬取需要登錄的網(wǎng)站完整示例

    Python實(shí)現(xiàn)爬取需要登錄的網(wǎng)站完整示例

    這篇文章主要介紹了Python實(shí)現(xiàn)爬取需要登錄的網(wǎng)站,結(jié)合完整實(shí)例形式分析了Python登陸網(wǎng)站及數(shù)據(jù)抓取相關(guān)操作技巧,需要的朋友可以參考下
    2017-08-08
  • pandas df.sample()的使用

    pandas df.sample()的使用

    本文主要介紹了pandas df.sample()的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Django配置Redis使用的方法步驟

    Django配置Redis使用的方法步驟

    本文主要介紹了Django配置Redis使用的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05

最新評(píng)論

新邵县| 长春市| 九龙坡区| 赣榆县| 惠来县| 滁州市| 武冈市| 布拖县| 贺州市| 台东县| 台南市| 灵川县| 东乡族自治县| 德钦县| 汝城县| 吉水县| 吉水县| 邮箱| 扬州市| 宝兴县| 芷江| 罗定市| 德令哈市| 祁门县| 淅川县| 正镶白旗| 平利县| 遵义市| 兴和县| 广灵县| 开平市| 亚东县| 岳池县| 手游| 鄂托克前旗| 华容县| 玉山县| 兴宁市| 沈阳市| 余干县| 石家庄市|