【一】名稱空間
【1】什么是名稱空間
名稱空間就是存放函數(shù)名與函數(shù)值對(duì)應(yīng)關(guān)系的地方
變量名=變量值
用變量名 和 變量值進(jìn)行綁定 ---> 名稱空間
名稱空間即存放名字與對(duì)象映射/綁定關(guān)系的地方
【2】名稱空間
[1]內(nèi)建名稱空間
- 在Python解釋器中自帶的名稱空間會(huì)隨著代碼啟動(dòng)而生成,隨著代碼結(jié)束而關(guān)閉
[2]全局名稱空間
- 隨著內(nèi)建名稱空間加載完成自己創(chuàng)建的變量名 / 函數(shù)名 / 類名
列表是可變數(shù)據(jù)類型 ---> 列表被修改后id不變
num_list = []
print(id(num_list)) # 1200291395392
def add_list(num):
num_list.append(num)
print(id(num_list)) # 1200291395392
add_list(1)
add_list(2)
add_list(3)
print(num_list) # [1, 2, 3]
print(id(num_list)) # 1200291395392
[3]局部名稱空間
- 在函數(shù)內(nèi)部或者是類內(nèi)部定義的變量隨著函數(shù)啟動(dòng)而創(chuàng)建,隨著函數(shù)結(jié)束而消失
- 伴隨函數(shù)的調(diào)用/結(jié)束而臨時(shí)產(chǎn)生/回收,函數(shù)的形參、函數(shù)內(nèi)定義的名字都會(huì)被存放于該名稱空間中
def add_list(num):
# 垃圾回收機(jī)制 ---> 節(jié)省內(nèi)存開(kāi)銷(xiāo)
num_list = []
num_list.append(num)
print(num_list)
print(id(num_list)) # 1200291395392
add_list(1)
add_list(2)
add_list(3)
【3】名稱空間的加載順序
- 先加載內(nèi)建名稱空間
- 其次是全局名稱空間
- 最后就是局部名稱空間
【4】名稱空間的查找順序
- 如果你在全局查 先全局后內(nèi)建 --> 在 py 文件中執(zhí)行代碼
- 如果在局部 先局部再全局再內(nèi)建 ---> 在函數(shù)內(nèi)部執(zhí)行代碼
- 所有的變量 尤其是 可變數(shù)據(jù)類型 字典 列表 盡量寫(xiě)在文件開(kāi)頭 如果放在函數(shù)下面可能會(huì)導(dǎo)致檢索不到變量
【二】作用域
【1】變量作用域
-
變量的作用域
- Python是靜態(tài)作用域,也就是說(shuō)Python中,變量的作用域源于它在代碼中的位置
- 在不同的位置,可能有不同的命名空間。命名空間是變量作用域的體現(xiàn)形式
-
python變量作用域一般有4種:
- Local(局部變量)
- Enclosed(嵌套)
- Global(全局)
- Built-in(內(nèi)置)
[1]Local 局部變量
- Local(局部變量):暫時(shí)的存在,依賴于創(chuàng)建該局部作用域的函數(shù)。函數(shù)存,則局部變量存,函數(shù)亡,則局部變量亡
- 作用范圍:當(dāng)前整個(gè)函數(shù)體范圍
# 定義一個(gè)函數(shù),函數(shù)內(nèi)部就是局部作用域
def fun():
# 只有在函數(shù)內(nèi)部的變量
b = 2
print(b) # 輸出2
fun()
# 調(diào)用函數(shù)后,發(fā)現(xiàn)找不到變量 b 是因?yàn)樵谌肿饔糜蛑姓也坏?變量 b
print(b) # 報(bào)錯(cuò)
'''
Traceback (most recent call last):
File "E:\PythonProjects\def_func.py", line 16, in <module>
print(b) # 報(bào)錯(cuò)
NameError: name 'b' is not defined
'''
[2]Enclosed 嵌套
- Enclosed(嵌套):一般是在函數(shù)中嵌套函數(shù)的時(shí)候,外層函數(shù)的變量作用域。
- 作用范圍:閉包函數(shù)
# Enclosed(嵌套)作用域
def fun1():
b = 2
print("這是fun1打印的:", b)
def fun2():
# 函數(shù) func1 里面 嵌套的 函數(shù) func2 里面的作用域就是 嵌套作用域
print("這是fun2打印的:", b)
# 將內(nèi)部函數(shù) func2 的內(nèi)存地址返回
return fun2
# 調(diào)用 函數(shù) fun1 , 函數(shù) func1 的返回值是內(nèi)部函數(shù) fuc2的函數(shù)地址
temp = fun1()
# 調(diào)用 函數(shù) fun1 的返回值(fuc2的函數(shù)地址) , 從而執(zhí)行 函數(shù) fuc2
temp()
# 這是fun1打印的: 2
# 這是fun2打印的: 2
[3]Global 全局
- Global(全局):一般模塊文件頂層聲明的變量具有全局作用域,從外部來(lái)看,模
塊的全局變量就是一個(gè)模塊對(duì)象的屬性,僅限于單個(gè)模塊文件中。
- 作用范圍:當(dāng)前模塊(文件)
# Global(全局)作用域
# 定義在全局的變量,在本文件任意位置可調(diào)用該變量
a = 2
def fun1():
print("這是fun1打印的:", a)
fun1()
print(a)
# 這是fun1打印的: 2
# 2
[4]Built-in 內(nèi)置
- Built-in(內(nèi)置):解釋器內(nèi)置的變量,比如int, str等。
- 作用范圍:所有模塊(文件)
- Python中沒(méi)有塊級(jí)作用域。
- 塊級(jí)作用域:代碼塊中的變量,比如if、while、for后面的代碼
【2】LEGB規(guī)則
按照L--->E--->G--->B的順序查找變量
[1]基于命名空間的常見(jiàn)變量類型
- 局部變量:
- 在一個(gè)函數(shù)體的內(nèi)部定義的變量
- 作用域?yàn)楹瘮?shù)內(nèi)部
- 查看局部變量命令:locals()
- 全局變量
- 在函數(shù)體外部,文件最外層定義的變量
- 作用域?yàn)檎麄€(gè)文件內(nèi)部
- 查看全局變量命令:globals()
![]()
【3】變量的修改
[1]global修改全局變量
![]()
[2]nonlocal修改外層函數(shù)變量
![]()