Python基礎之名稱空間、作用域
阿新 • • 發佈:2022-03-27
一、名稱空間
名稱空間namespacs:存放名字的地方,是對棧區的劃分。
有了名稱空間之後,就可以在棧區中存放相同的名字,詳細的,名稱空間
例如:username='jason'(函式命名的空間,username指向jason指向的記憶體空間地址,而username在外部也有自己的空間)
型別:三種
1.內建的名稱空間
存放的名字:存放的python直譯器內建的名字
''' >>> print <built-in function print> >>> input <built-in function input>''' # 存活週期:python直譯器啟動則產生,python直譯器關閉則銷燬
2、全域性名稱空間
存放的名字:只要不是函式內定義、也不是內建的,剩下的都是全域性名稱空間的名字
存活週期:python檔案執行則產生,python檔案執行完畢後銷燬
# import os # # x=10 # if 13 > 3: # y=20 # if 3 == 3: # z=30 # # # func=函式的記憶體地址 # def func(): # a=111 # b=222 # class Foo: # pass
3、區域性名稱空間
存放的名字:在呼叫函式時,執行函式體程式碼過程中產生的函式內的名字
存活週期:在呼叫函式時存活,函式呼叫完畢後則銷燬
# def func(a,b): # pass # # func(10,1) # func(11,12)
4、載入順序:內建名稱空間>全域性名稱空間>區域性名稱空間。名字的查詢優先順序:當前所在的位置向上一層一層查詢。名稱空間的"巢狀"關係是以函式定義階段為準,與呼叫位置無關
# 如果當前在區域性名稱空間: # 區域性名稱空間—>全域性名稱空間->內建名稱空間 # # input=333 全域性 # # def func():# # input=444 #此時為區域性空間 # print(input) #此時下面呼叫函式,這個是在函式內部,所以先區域性 # # func() # 如果當前在全域性名稱空間 # 全域性名稱空間->內建名稱空間 # input=333 全域性 # def func(): # input=444 # func() # print(input) 未在函式內部,需要全域性
二、作用域
1.全域性作用域:內建名稱空間、全域性名稱空間
1、全域性存活
2、全域性有效:被所有函式共享
# x=111 #作用全域性 # # def foo(): # print(x,id(x)) # # def bar(): # print(x,id(x)) # # foo() # bar()
2.區域性作用域: 區域性名稱空間的名字
1、臨時存活
2、區域性有效:函式內有效
def text(): #區域性變數 a= "aaa" b= "bbb" return a ,b print(text())
關係等級圖
# LEGB # builtin # global全域性 # def f1(): # # enclosing # def f2(): # # enclosing # def f3(): # local區域性 # pass
區域性與全域性變數之修改
1.如果再區域性想要修改全域性的名字對應的值(不可變型別),需要用global
x=111 def func(): global x # 宣告x這個名字是全域性的名字,不要再造新的名字了 x=222 func() print(x) #此時全域性變數x就被改為222
2.nonlocal(瞭解): 修改函式外層函式包含的名字對應的值(不可變型別)
x=0 def f1(): x=11 def f2(): #nonlocal x x=22 f2() print('f1內的x:',x) #此時nonlocal x作用,導致f1內的x被修改為22 f1()