麻豆黑色丝袜jk制服福利网站-麻豆精品传媒视频观看-麻豆精品传媒一二三区在线视频-麻豆精选传媒4区2021-在线视频99-在线视频a

千鋒教育-做有情懷、有良心、有品質的職業教育機構

手機站
千鋒教育

千鋒學習站 | 隨時隨地免費學

千鋒教育

掃一掃進入千鋒手機站

領取全套視頻
千鋒教育

關注千鋒學習站小程序
隨時隨地免費學習課程

當前位置:首頁  >  技術干貨  > Python 中的作用域

Python 中的作用域

來源:千鋒教育
發布人:wjy
時間: 2022-09-13 17:42:30 1663062150

  命名空間

  一個程序具有多個變量,為了更好的組織這些變量,更好的控制變量之間的命名沖突以及更好的管理變量在程序中的角色,python使用了命名空間這樣一種結構來實現這個目的。python中,一個命名空間由多個變量組成,且以字典的形式來保存這些變量,其中key是變量名稱,value是變量名對應的對象。

  同一個命名空間中的變量名是唯一的,不同命名空間中的變量相互獨立(這里的相互獨立指的是不會相互沖突相互覆蓋,但是可能會有相同的對象引用(即指向同一個內存中的對象))。既然命名空間是為了更好的控制變量之間的命名沖突以及更好的管理變量在程序中的角色,那么什么情況下把兩個變量放入同一個命名空間,即以什么樣的邏輯和規則定義變量的命名空間就是最基本的問題。

  python中約定了四種命名空間:內置的(Bulit-in)、全局的(Global)、外層函數的(Enclosing or Nonlocal)以及本地的(Local)。

Python 中的作用域

  這四種命名空間的定義規則和邏輯如下:

  內置的(Bulit-in):python定義的所有的內置變量,比如abs、max這些內置函數以及預定義的異常等,這些變量都放在內置命名空間中,可以通過python的標準模塊builtins獲取所有的內置變量。

  全局的(Global):在模塊(腳本)頂層定義的所有變量,python把這些變量會放在該模塊的全局命名空間中,可以通過globals()獲取當前位置已經定義了的所有全局變量。

  本地的(Local):python中函數的每次調用會新創建一個自己的命名空間,這個命名空間包含的變量為函數參數和函數中定義的所有變量,這些變量也成為該函數的本地變量。

  外層函數的(Enclosing or Nonlocal):如果函數A中嵌套了一個函數B,那么對于內層函數B來說,外層函數A的本地命名空間就是B的外層函數命名空間。單純從命名空間的角度看,似乎外層函數命名空間和本地命名空間重復定義了,因為其本身就是外層函數的本地命名空間。但從作用域和變量查找的角度看,并不會重復定義;實際上,在python2.2之前,這層命名空間是不存在的,2.2版本的python才加入了這層命名空間,加入后,使得函數B直接引用函數A的本地變量變為可能;因此,對于這種嵌套函數形式下的外層函數命名空間,python給了其一個單獨的定義。

  作用域和LEGB變量查找規則

  定義好命名空間之后,我們知道具有同一個名稱的不同變量可能同時存在于多個不同的命名空間中,那么問題來了:當我們引用一個變量x,x同時存在于多個命名空間中,python如何知道我們引用的是哪一個?python對此引入了作用域和變量查找規則來消除這種歧義性。

  域( scope)指的就是程序的文本區域。python中的域指的就是變量的作用域,某個變量的作用域指的是這樣一個區域在這個區域中,python可以直接獲取到該變量,直接獲取的意思是可以直接在該變量的命名空間中找到該變量,而不是通過屬性訪問等其他方式獲取。 所以通過明確變量的作用域可以讓我們知道某個變量在程序的哪些地方起作用(可以被直接獲取),同時約定了變量作用域還可以消除部分的歧義性,因為對于某個變量并不起作用的區域,我們自然就不需要在該區域考慮該變量。

  對于上述四種不同命名空間里的變量,其各自有自己的作用域,分別如下:

  全局(變量)作用域:指的就是全局變量的作用域,也就是整個模塊文件;

  內置(變量)作用域:指的就是內置變量的作用域,包括整個解釋器環境;

  外層函數(變量)作用域:也指非本地作用域,指的就是外層函數中變量的作用域,包括整個外層函數下的代碼塊,同時也是外層函數的本地作用域;

  本地(變量)作用域:就是一個函數下定義的本地變量的作用域,為函數下的代碼塊區域。

  明確上述四種變量的各自作用域后,依然存在歧義性,因為不同命名空間中的相同名稱的變量的作用域可能存在重復,比如有一個全局變量x,在一個函數中又定義了一個本地變量x,那么該函數中的代碼塊即是全局變量x的作用域,也是本地變量x的作用域。針對這種情況,python中規定了變量在不同命名空間中的查找順序,依次為:本地命名空間(L)、外層函數命名空間(E or N)、全局命名空間(G)以及內置命名空間(B),這稱為python變量查找的LEGB(LNGB)規則。如此,即使不同命名空間中存在相同名稱的變量且作用域重復,根據該規則,就可以確定python查找的變量對應的值到底是哪一個,從而可以消除變量名的歧義性。

  需要注意的是,LEGB(LNGB)規則是python將源碼編譯成字節碼時的變量作用域解析規則,所以實際上,變量的命名空間在編譯時就被靜態確定了,從而在解釋器執行編譯后的字節碼時,python會直接在變量對應的命名空間中去獲取該對象。

  最后強調一下外層函數命名空間和作用域,該命名空間是在python2.2版本加入的,在2.2之前的版本,如下代碼如無法運行成功,因為對于inner函數中的x,python只會在本地命名空間、全局命名空間和內置命名空間中查找,outer函數的命名空間會被直接跳過,因此下面的代碼會因為找不到x而報錯。2.2之前的版本為了使用outer函數的x,一般需要把x作為參數傳給inner。但是在2.2版本開始,加入了Enclsoing function概念,也就是outer函數,該函數的命名空間為外層函數命名空間,其變量的作用域包含了inner函數的代碼塊,因此python在查找x變量時,也會查找該外層函數的命名空間。

tags:
聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。
10年以上業內強師集結,手把手帶你蛻變精英
請您保持通訊暢通,專屬學習老師24小時內將與您1V1溝通
免費領取
今日已有369人領取成功
劉同學 138****2860 剛剛成功領取
王同學 131****2015 剛剛成功領取
張同學 133****4652 剛剛成功領取
李同學 135****8607 剛剛成功領取
楊同學 132****5667 剛剛成功領取
岳同學 134****6652 剛剛成功領取
梁同學 157****2950 剛剛成功領取
劉同學 189****1015 剛剛成功領取
張同學 155****4678 剛剛成功領取
鄒同學 139****2907 剛剛成功領取
董同學 138****2867 剛剛成功領取
周同學 136****3602 剛剛成功領取
相關推薦HOT
主站蜘蛛池模板: 高清男的插曲女的欢迎你老狼| yw在线观看成人免费| 快点cao我要被cao烂了| 在线网站你懂得| 欧美aa在线观看| 男女做污污| 干妞网免费视频| 在线观看视频国产| 午夜剧场1000| 天天色影网| 一线在线观看全集免费高清中文| 国产三级在线播放线| 国产一卡二卡| 尹人香蕉网在线观看视频| 男人的天堂毛片| 亚洲欧美一区二区三区| 国产欧美va欧美va香蕉在线 | gay肌肉猛男gay激情狂兵| 日本三级电电影在线看| 成年人免费观看| 欧美最猛黑人xxxx| 草莓视频污污在线观看| 99久久精品费精品国产一区二区| 免费一级做a爰片久久毛片潮喷| 鲤鱼乡太大了坐不下去| 俺也去网站| 99久久精品费精品国产一区二区| 樱桃视频影院在线播放| 好吊操在线视频| 久久综合九色综合网站| 91精品国产免费| 亚洲欧美一区二区三区| 天天做日日做| 成年片人免费www| 国产破外女出血视频| 北条麻妃毛片在线视频| 日韩欧美一区二区三区免费观看| 窈窕淑女韩国在线看| 女偶像私下的y荡生活| 亚洲午夜精品一区二区| 欧美边吃奶边爱边做视频|