摘要:在內置命名空間不能使用全局和局部的名字。可以形象地理解成內置命名空間具有最高級別,不需要定義就可以使用,全局命名空間次之,最低級是局部命名空間。
python中的命名空間分三種: 內置的命名空間,在啟動解釋器的時候自動加載進內存的各種名字所在的空間,比如print,input等不需要定義就可以使用的名字 全局命名空間,就是從上到下所有我們定義的變量名和函數名所在的空間,是在程序從上到下被執行的過程中加載進內存的。 局部命名空間,比如函數在執行時所開辟的空間,里面存放了函數內部定義的各種名字,隨著函數執行結束 這個局部命名空間就消失了。 在局部命名空間可以使用全局和內置命名空間中的名字 在全局命名空間可以使用內置命名空間中的名字,但不能使用局部命名空間的。 在內置命名空間不能使用全局和局部的名字。 可以形象地理解成內置命名空間具有最高級別,不需要定義就可以使用,全局命名空間次之,最低級是局部命名空間。 當低級命名空間使用名字時首先會在自身的命名空間里查找,如果有就使用,沒有的話就到上一級命名空間內查找,如果有就使用,沒有就繼續到更上一級空間內查找,直到頂層的內置命名空間,如果有就使用,沒有則會報錯。 舉個例子如下:
num = 1 #這是全局命名空間內定義的num = 1 def func1(): #這個函數會創建一個局部命名空間1 num = 2 #這是在局部命名空間1定義的num = 2 def func2(): #這個函數會創建一個局部命名空間2 num = 3 #這是在局部命名空間2 內 定義的num = 3 print(num) #這是在局部命名空間2內 使用num 變量 func2() # 調用函數func2時 會執行該命令創建局部命名空間2 func1() #調用函數func1時會創建局部命名空間1, #這幾個命名空間的級別順序是:內置>全局>局部1>局部2 #當print(num)指令執行時它會在局部2內查找是否有num,發現有則直接引用,如果沒有則會到上一級(局部1)中查找,局部1沒有則繼續到上一級(全局)查找
再看一個例子:
#max()函數是內置的函數,如果我們在全局命名空間中定義了函數名為max的函數時,則該函數就失效了,也就是說在自身空間內找到了max()后就不去內置命名空間查找了 def max(a,b,c): return "max失效了?" print(max(1,2,3))# 正常情況下應該輸出3(max函數功能是返回最大值),但是因為我們把max這個名字占用了,所以當使用時程序就不去上一級空間(內置命名空間)去查找了
與命名空間有關的兩個函數globals()和locals()
可以用globals()查看全局命名空間的所有定義的名字
可以用locals()查看當前命名空間的所有定義的名字,在全局則返回全局,在局部則返回局部
這兩個函數的返回值可以看作是字典,格式都是{key1:value1,key2:value2,.....}
當函數1內嵌套函數2時,對于函數1內的不可變數據類型的變量,函數2內可以引用,但不可修改
def func1(): a = 1 def func2(): a = a + 1 #此處會報一個嚴重錯誤,因為a同時出現在等號兩邊,Python會先執行等號右邊的表達式, #發現你在引用a,然后它會先在本空間查找a,結果找到了等號左邊的a,其結果就是“在定義變量前引用變量” pass func2() func1()
#如果想要修改,可以使用nonlocal(python3中新增) def func1(): a = 1 def func2(): nonlocal a a = a + 1 func2() print(a) func1() #我們可以看出,執行func2()后再輸出a,a已經變成2了 2nonlocal只能作用于局部變量,當使用后它會自動查找上一級局部命名空間是否有該變量,如果沒有繼續向上查找,直到最上一級“局部命名空間”
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42576.html
摘要:我們說觸發了閉包的函數叫做閉包函數閉包最大的特點就是它可以被外層函數返回后賦值給一個變量,并且攜帶了外層函數內定義的變量例子如下變量為函數開辟的局部命名空間內定義的變量函數內引用了變量的內層函數名被當作返回值,此時閉包規則達成。 什么是閉包? 其實我們在使用函數過程中不經意間就會觸發閉包,因為總會出于某種原因會在函數內引用或修改上一層函數的變量,這時就會觸發閉包 那么什么是閉包?其實就...
摘要:事實上語言當中有的內容,比如函數循環結構體宏等等內容,也都有,所以大家千萬不要認為語言白學了哈因為之前已經完整更新過語言的博客有需要可以往前翻,所以這里直接介紹相對語言當中新增的內容,而本章引入的內容是的關鍵字命名空間缺省參數函數重載。 ...
摘要:定義函數中的函數使用關鍵字定義,格式為函數名形參函數語句塊函數名只能包含字符串下劃線和數字且不能以數字開頭。所以默認參數還是放在后面合適。 定義函數 python中的函數使用關鍵字 def 定義,格式為: def 函數名(形參): 函數語句塊 函數名只能包含字符串、下劃線和數字且不能以數字開頭。函數的形參分為:位置參數、默認參數(自帶默認值的參數)、動態參數return是關鍵字...
摘要:在大型的工程中,自己定義的變量函數,類名與其他人定義的相沖突等問題。使用標準輸出控制臺和標準輸入鍵盤時,必須包含頭文件以及標準命名空間。缺省參數概念缺省參數是聲明或定義函數時為函數的參數指定一個默認值。 目錄 前言 1.命名空間 1.1命名空間定義 1.2 命名空間使用 2. C++的輸入和...
摘要:正如我們前面舉的張三的例子那樣,不同命名空間中的名稱之間沒有任何關系。作用域作用域,是一個命名空間可直接發放完的代碼的文本區域。刪除也是如此,語句會從局部命名空間的引用中移除對的綁定。 命名空間和作用域的概念我們之前也提到過,比如內置函數globals(),函數中變量的作用域,模塊使用的import等等。這些可能讓我們對這兩個概念有了大致的理解。本節再詳細探討一下。 showImg(h...
閱讀 2401·2021-10-09 09:44
閱讀 2138·2021-10-08 10:05
閱讀 3428·2021-07-26 23:38
閱讀 3000·2019-08-28 18:16
閱讀 816·2019-08-26 11:55
閱讀 1826·2019-08-23 18:29
閱讀 2039·2019-08-23 18:05
閱讀 1368·2019-08-23 17:02