1.作用域的介紹:#也叫名稱空間
全局名稱空間:創建的儲存"變量名與值的關系"的空間叫做全局名稱空間 #
局部名稱空間:在函數的運行中開辟出來的空間叫做局部名稱空間 #並非單指函數,例如在模塊中,在類中的簡單賦值操作都是局部作用域
內置名稱空間:內置名稱空間中存放了python解釋器為我們儲存的的函數,例如len(),print(),list()...都是python為我們創建好的內置函數。
python中的作用域分4中情況:
* L : local,局部作用域,函數中定義的變量
* E : enclosing,嵌套的父級函數的局部作用域,即包含此函數的上級函數的局部作用域,但不是全局的(閉包常見)
* G : globa,全局變量,是模塊級別定義的變量
* B : bulit-in,系統固定模塊里的變量,就是內置空間定義的 int(),print(),list()
加載變量的優先級順序依次是:python內置作用域>當前模塊中的全局(文件從上而下讀取)>外層作用域>局部作用域
搜索變量的優先級順序依次是:作用域局部>外層作用域>當前模塊中的全局>python內置作用域,也就是LEJB
local 和 enciosing 是相對的,enclosing 變量相對上層來說也是 local
內置作用域:
x = int(2.9)# int就是內置作用域。(bulit-in)
全局作用域:
name = "mike" 變量賦值時的name就是全局變量(globa)
局部作用域:
def numbers(): number=10 # 函數內的number的賦值就是局部作用域(local)
嵌套的子級局部作用域:
def numbers(): number=10#局部作用域
def in_numbers(): in_number=20 # 子級局部作用域
搜索變量的優先級:
first1 = 2#全局變量 def numbers(): first1=10#局部變量 def in_numbers(): second = 20#嵌套的局部變量 print(first1) in_numbers() numbers() #執行結果 10 #我定義了兩個first1變量,一個是全局變量first1 = 2,一個是局部變量first1=10 #但是當我在使用嵌套的函數中打印變量名為first1時,打印的是10,而不是2,說明執行的結果為內部向外部一步步的進行搜索 #嵌套函數in_numbers首先向內部搜索,沒有搜索到,然后開始向外部函數搜索,搜索到結果后立即返回
搜索變量時只能內部向外部進行搜索,而不能外層向內層搜索,除非先聲明這個變量的歸屬。
作用域的產生:
在Python中,只有模塊(module),類(class)以及函數(def、lambda)才會引入新的作用域,其它的代碼塊(如if、try、for等)是不會引入新的作用域的
例0:
>>>if 10>9: >>> x=1 >>>print(x)#可正常執行 1
例1:
>>>def number(): >>> x=1 >>>print(x) print(x) NameError: name 'x' is not defined #python為我們指出了錯誤代碼表示找不到x,因為我們知道,在全局環境中無法進行搜索局部環境的
變量的修改:
錯誤聲明:
x=6 def f2(): print(x)#打印 x=5 f2() #開始我認為是因為已經尋找了全局變量x的賦值,因為x已經加載至局部函數中,我企圖在局部修改全局變量才會報錯 #實驗后發現應該是因為已經加載了內部函數,python發現了先引用后聲明的行為而導致的報錯 #測試方法為:當注釋掉x=5時該程序可正常運行,尋找到了全局變量x=6,說明x=5和報錯有着直接關系,但是還存在一種可能,當打印x時調用了全局變量x,下面的程序對全局變量進行修改,導致的報錯。但是在代碼print(x)后面加上代碼return直接返回時,依舊會報錯,說明了這個函數程序並非一步步執行的,而是先加載函數后執行。 def f2(): x+=1 #這里的錯誤就是因為局部變量想要修改全局變量導致的報錯
global關鍵字:
使用global關鍵字時可以幫助你在局部中修改全局變量
count = 10 def outer(): global count#聲明這是全局變量,可對全局變量進行修改 print(count) count = 100 print(count) outer() #10 #100 # global 能少用就少用,因為會對全局變量做出修改,影響全局其他地方用這個全局變量
nonlocal關鍵字:
當在嵌套局部作用域上時,想要對局部作用域進行修改時,可以使用弄nonlocal關鍵字,global關鍵字只能在基於外部為全局變量是進行聲明,而nonlocal可以在嵌套的局部中進行聲明
def function1(): number = 200 #局部作用域 def in_function1(): nonlocal number#聲明這是引用外部的局部作用域 number = 100#更改外部的局部作用域 print(number) in_function1() print(number) function1() #100 #100