摘要:例題核心編程第二版變量作用域和命名空間一節有以下一道題目請問輸出結果是什么要想解這道題,必須先了解中的一些概念的變量名解析機制有時稱為。
例題
《核心編程(第二版)》變量作用域和命名空間一節有以下一道題目
# coding=utf-8 #!/usr/bin/env python def proc1(): j,k = 3,4 print "j == %d and k == %d" % (j,k) k = 5 def proc2(): j = 6 proc1() print "j == %d and k == %d" % (j,k) k = 7 proc1() print "j == %d and k == %d" % (j,k) j = 8 proc2() print "j == %d and k == %d" % (j,k)
請問輸出結果是什么?
要想解這道題,必須先了解Python中的一些概念:
LEGBPython 的變量名解析機制有時稱為LEGB。
L: Local 是函數內的名字空間,包括局部變量和形參
E: Enclosing 外部嵌套函數的名字空間(閉包中常見)
G: Global 全局變量,函數定義所在模塊的名字空間
B: Builtin 內置模塊的名字空間
查找的順序為:L--->E--->G--->B
查找一個x 的變量,Python 首先在函數內部,局部(Local)范圍來查找這個變量;
如果沒有找到,則到包含這個函數定義的外圍去查找(稱作 Enclosing),這個外圍或許是另外一個函數(包括匿名函數)。
如果還是沒有,繼續朝外查找,一直到模塊級別,從這里定義了全局(Global)變量中尋找;
如果仍然沒有找到,則查找 Python 內置變量(Built-in),看是否有相同名字的。
注:在上述查找過程中,一旦變量找到,就不再繼續朝外圍查找。也就是說 LEGB 同時也定義了從 L 到 B 得優先級。
題解上題目輸出結果如下:
j == 3 and k == 4 name "j" is not defined #注釋對應代碼后出現以下三列結果 j == 3 and k == 4 j == 6 and k == 7 j == 8 and k == 7
具體解釋如下:
proc1() 函數內部就有j,k,停止向上查找,故j == 3 and k == 4
print "j == %d and k == %d" % (j,k),程序從上往下執行,當前只定義k=7,j還未定義,因為已經是全局變量了,Builtin中未定義j,因此返回未定義的錯誤。
proc2()中會調用proc1()依舊先打印j == 3 and k == 4
proc2()內部需要打印,j,k值,j本地已經定義為6,k未定義,則向上查找,查找到全局變另種定義了k=7,因此輸出:j == 6 and k == 7
print "j == %d and k == %d" % (j,k),前面的程序已經給j,k進行了賦值,直接輸出即可,j == 8 and k == 7
來源參考:1.理解 Python 的 LEGB
2.零基礎學python-16.3 變量名解析:LEGB原則
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/45499.html
摘要:理解的名字空間的名字空間是一個非常核心的內容。在中提供了一個關鍵字來修改外部嵌套函數的名字空間,但是要使用才有,我等使用的只能眼饞一下。 理解 Python 的 LEGB 名字空間 Python 的名字空間是 Python 一個非常核心的內容。 其他語言中如 C 中,變量名是內存地址的別名,而在 Python 中,名字是一個字符串對象,它與他指向的對象構成一個{name:obje...
摘要:真正管理這些名子的事物就是本文的主角命名空間。閉包命名空間閉包函數的名稱空間引入。函數調用時產生新的局部命名空間函數返回結果拋出異常時釋放命名空間,每一次遞歸都生成一個命名空間。標識符產生地點決定標識符所處的命名空間。 懶得掃全文的童鞋,可以直接跳到最后看總結。我們先從一個簡單的栗子說起: 栗子 a 文件中有變量 va 以及類 A,b 文件導入 a 中class A ,并打印出 A: ...
摘要:需求背景最近在工作上遇到了一個比較特殊的需求為了安全設計一個函數或者裝飾器然后用戶在定義調用函數時只能訪問到我們允許的內置變量和全局變量通過例子來這解釋下上面的需求輸出函數功能簡單明了對于結果大家應該也不會有太大的異議分別是取得全局命名空間 需求背景 最近在工作上, 遇到了一個比較特殊的需求: 為了安全, 設計一個函數或者裝飾器, 然后用戶在 定義/調用 函數時, 只能訪問到我們...
摘要:約束名字空間作用域之間的那些事不管在什么編程語言都有作用域這個概念作用域控制在它范圍內代碼的生存周期包括名字和實體的綁定名字和實體的綁定我們可以理解成賦值當我們執行這句代碼時實際上我們已經得到一個的關聯關系我們也能將稱之為約束這個約束也將存 約束 名字空間 作用域 之間的那些事 不管在什么編程語言, 都有作用域這個概念.作用域控制在它范圍內代碼的生存周期, 包括名字和實體的綁定. 名字...
摘要:當程序引用某個變量的名字時,就會從當前名字空間開始搜索。對于可以看出已經被導入到自己的名字空間了,而不是在里面。因此并沒有涉及到修改名字空間。按照原則,搜到有變量并且是個然后將其加入到自己的后面的就開始讀取的元素,并沒有影響的名字空間。 源自我的博客 前言 python里面最核心的內容就是:名字空間(namespace) 例子引入 例1 #!/usr/bin/env python #...
閱讀 3597·2023-04-26 01:43
閱讀 2986·2021-10-14 09:42
閱讀 5480·2021-09-30 09:59
閱讀 2184·2021-09-04 16:40
閱讀 1222·2019-08-30 15:52
閱讀 840·2019-08-29 17:09
閱讀 2008·2019-08-26 13:37
閱讀 3443·2019-08-26 10:20