久久精品国产亚洲高清|精品日韩中文乱码在线|亚洲va中文字幕无码久|伊人久久综合狼伊人久久|亚洲不卡av不卡一区二区|精品久久久久久久蜜臀AV|国产精品19久久久久久不卡|国产男女猛烈视频在线观看麻豆

    1. <style id="76ofp"></style>

      <style id="76ofp"></style>
      <rt id="76ofp"></rt>
      <form id="76ofp"><optgroup id="76ofp"></optgroup></form>
      1. 千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

        手機(jī)站
        千鋒教育

        千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

        千鋒教育

        掃一掃進(jìn)入千鋒手機(jī)站

        領(lǐng)取全套視頻
        千鋒教育

        關(guān)注千鋒學(xué)習(xí)站小程序
        隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

        當(dāng)前位置:首頁  >  技術(shù)干貨  > python命名空間和作用域

        python命名空間和作用域

        來源:千鋒教育
        發(fā)布人:xqq
        時(shí)間: 2023-11-07 18:54:23 1699354463

        命名空間表示標(biāo)識(shí)符(identifier)的可見范圍,當(dāng)前命名空間主要是通過Python字典實(shí)現(xiàn)的,不過通常不關(guān)心具體的實(shí)現(xiàn)方式(除非出于性能考慮),以后也有可能會(huì)改變其實(shí)現(xiàn)方式。有一些命名空間的例子:內(nèi)置命名(像abs()這樣的函數(shù),以及內(nèi)置異常名)集,模塊中的全局命名,函數(shù)調(diào)用中的局部命名。某種意義上講對(duì)象的屬性集也是一個(gè)命名空間。有幾個(gè)點(diǎn)需要注意下:

        第一:不同命名空間中的命名沒有任何聯(lián)系,例如兩個(gè)不同的模塊可能都會(huì)定義一個(gè)名為maximize的函數(shù)而不會(huì)發(fā)生混淆--用戶必須以模塊名為前綴來引用它們。

        第二:不同的命名空間在不同的時(shí)刻創(chuàng)建,有不同的生存期。包含內(nèi)置命名的命名空間在Python解釋器啟動(dòng)時(shí)創(chuàng)建,會(huì)一直保留,不被刪除。模塊的全局命名空間在模塊定義被讀入時(shí)創(chuàng)建,通常,模塊命名空間也會(huì)一直保存到解釋器退出。由解釋器在最高層調(diào)用執(zhí)行的語句,不管它是從腳本文件中讀入還是來自交互式輸入,都是__main__模塊的一部分,所以它們也擁有自己的命名空間。(內(nèi)置命名也同樣被包含在一個(gè)模塊中,它被稱作__builtin__。)

        第三:當(dāng)調(diào)用函數(shù)時(shí),就會(huì)為它創(chuàng)建一個(gè)局部命名空間,并且在函數(shù)返回或拋出一個(gè)并沒有在函數(shù)內(nèi)部處理的異常時(shí)被刪除。(實(shí)際上,用遺忘來形容到底發(fā)生了什么更為貼切。)當(dāng)然,每個(gè)遞歸調(diào)用都有自己的局部命名空間。

        作用域是定義程序該如何搜索確切地“名字-對(duì)象”的名空間的層級(jí)關(guān)系。是一個(gè)Python程序可以直接訪問命名空間的正文區(qū)域。意思是一個(gè)對(duì)名稱的錯(cuò)誤引用會(huì)嘗試在命名空間內(nèi)查找。盡管作用域是靜態(tài)定義,在使用時(shí)他們都是動(dòng)態(tài)的。每次執(zhí)行時(shí),至少有四個(gè)命名空間可以直接訪問的作用域嵌套在一起:

        第一:innermostscope,包含局部命名的使用域在最里面,首先被搜索;

        第二:enclosingscope,中層的作用域,是內(nèi)層嵌套作用域搜索起點(diǎn),包含非局部,但是也非全局的命名

        第三:Globalscope,包含當(dāng)前模塊的全局命名

        第四:Built-inscope,包含內(nèi)置命名的命名空間。

        so,這么多的作用域,Python是按什么順序搜索對(duì)應(yīng)作用域的呢?著名的”LEGB-rule”,即scope的搜索順序:Local->Enclosing->Global->Built-in;當(dāng)有一個(gè)變量在local域中找不到時(shí),Python會(huì)找上一層的作用域,即enclosing域(該域不一定存在)。enclosing域還找不到的時(shí)候,再往上一層,搜索模塊內(nèi)的global域。最后,會(huì)在built-in域中搜索。對(duì)于最終沒有搜索到時(shí),Python會(huì)拋出一個(gè)NameError異常。作用域可以嵌套。比如模塊導(dǎo)入時(shí)。這也是為什么不推薦使用froma_moduleimport*的原因,導(dǎo)入的變量可能被當(dāng)前模塊覆蓋。下面是一個(gè)例子:

        defouter():

        a=0

        b=1

        definner():

        printa

        printb

        b=4

        inner()

        if__name__=="__main__":outer()

        Traceback(mostrecentcalllast):

        File"E:/PycharmProjects/CodeStatisticsTools/test_namespaces.py",line37,in

        outer()

        File"E:/PycharmProjects/CodeStatisticsTools/test_namespaces.py",line18,inouter

        inner()

        File"E:/PycharmProjects/CodeStatisticsTools/test_namespaces.py",line15,ininner

        printb

        UnboundLocalError:localvariable'b'referencedbeforeassignment

        如果去掉b=4就能正常運(yùn)行,這是為啥呢?在沒有b=4這行代碼時(shí),Python解釋器執(zhí)行到inner()中的printb時(shí),發(fā)現(xiàn)有個(gè)變量b在當(dāng)前作用域(local)中無法找到變量b,于是嘗試從enclosingscope中查找,找到后就能正常打印了。加上這行代碼后,在當(dāng)前作用域找到了b,但是變量b的賦值發(fā)生在print語句之后,于是拋出錯(cuò)誤:變量在賦值前就被引用。賦值語句通常隱式地會(huì)創(chuàng)建一個(gè)局部(local)變量,即便該變量名已存在于賦值語句發(fā)生的上一層作用域中

        以上內(nèi)容為大家介紹了python命名空間和作用域,希望對(duì)大家有所幫助,如果想要了解更多Python相關(guān)知識(shí),請(qǐng)關(guān)注IT培訓(xùn)機(jī)構(gòu):千鋒教育。

        聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
        10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
        請(qǐng)您保持通訊暢通,專屬學(xué)習(xí)老師24小時(shí)內(nèi)將與您1V1溝通
        免費(fèi)領(lǐng)取
        今日已有369人領(lǐng)取成功
        劉同學(xué) 138****2860 剛剛成功領(lǐng)取
        王同學(xué) 131****2015 剛剛成功領(lǐng)取
        張同學(xué) 133****4652 剛剛成功領(lǐng)取
        李同學(xué) 135****8607 剛剛成功領(lǐng)取
        楊同學(xué) 132****5667 剛剛成功領(lǐng)取
        岳同學(xué) 134****6652 剛剛成功領(lǐng)取
        梁同學(xué) 157****2950 剛剛成功領(lǐng)取
        劉同學(xué) 189****1015 剛剛成功領(lǐng)取
        張同學(xué) 155****4678 剛剛成功領(lǐng)取
        鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
        董同學(xué) 138****2867 剛剛成功領(lǐng)取
        周同學(xué) 136****3602 剛剛成功領(lǐng)取
        相關(guān)推薦HOT
        Python重命名和刪除文件

        python的os模塊提供了幫你執(zhí)行文件處理操作的方法,比如重命名和刪除文件。要使用這個(gè)模塊,你必須先導(dǎo)入它,然后才可以調(diào)用相關(guān)的各種功能。re...詳情>>

        2023-11-07 20:49:35
        python 序列化及其相關(guān)模塊

        什么是序列化對(duì)象?我們把對(duì)象(變量)從內(nèi)存中編程可存儲(chǔ)或傳輸?shù)倪^程稱之為序列化,在python中稱為pickle,其他語言稱之為serialization,marshal...詳情>>

        2023-11-07 20:42:23
        python生成器函數(shù)

        為什么叫生成器函數(shù)?因?yàn)樗S著時(shí)間的推移生成了一個(gè)數(shù)值隊(duì)列。一般的函數(shù)在執(zhí)行完畢之后會(huì)返回一個(gè)值然后退出,但是生成器函數(shù)會(huì)自動(dòng)掛起,然...詳情>>

        2023-11-07 20:31:35
        python 字典操作方法詳解

        字典是一種通過名字或者關(guān)鍵字引用的得數(shù)據(jù)結(jié)構(gòu),key類型需要時(shí)被哈希,其鍵可以是數(shù)字、字符串、元組,這種結(jié)構(gòu)類型也稱之為映射。字典類型是P...詳情>>

        2023-11-07 20:09:59
        python 集合操作方法詳解

        集合set集合用于包含一組無序的對(duì)象。與列表和元組不同,集合是無序的,也無法通過數(shù)字進(jìn)行索引。此外,集合中的元素不能重復(fù)。set和dict一樣,...詳情>>

        2023-11-07 20:06:23
        板桥市| 南华县| 潮州市| 汝阳县| 阳原县| 鄂尔多斯市| 许昌市| 长子县| 平原县| 阳江市| 安溪县| 寻乌县| 新泰市| 涟源市| 中西区| 禹州市| 宣化县| 汽车| 惠州市| 连江县| 罗田县| 株洲市| 吉安市| 鄂尔多斯市| 射阳县| 毕节市| 利辛县| 留坝县| 云浮市| 建昌县| 南江县| 巧家县| 西安市| 巴南区| 通山县| 瓦房店市| 乐昌市| 论坛| 冀州市| 儋州市| 神池县|