(a)locals
(b)globals
這裏還須要在補充2個關鍵字一塊兒比較學習,關鍵字:
(c)nonlocal
(d)globalpython
locals: 打印當前可用的變量的字典
globals: 返回一個描述當前全局變量的字典函數
提示:locals 是獲取當前的可用變量,而 globals 是獲取全局的變量學習
在使用 locals() 和 globals() 會出現如下三種表現形式:spa
(1)當locals 和 globals 都在全局做用域的時候,獲取的可用環境變量是一致的blog
print(globals() == locals()) print(locals()) print(globals()) # 執行結果: # True # {'__cached__': None, '__doc__': None, ......} # {'__cached__': None, '__doc__': None, ......}
分析:
locals 和 globals 都在全局做用域中時,兩者獲取到的變量是一致的。作用域
(2)當 locals 在局部做用域中,而 globals 在全局做用域中io
def func(): name = 'jay' print(locals()) func() print(globals()) print('name' in globals()) # 執行結果: # {'name': 'jay'} # {'__file__': 'E:/learn_python/day15-1/test4.py', '__name__': '__main__', 'func': <function func at 0x0000019865D57268>} # False
分析:
當 locals 在局部做用域中,而 globals 在全局做用域中時:
locals 獲取的僅僅是當前局部做用域中的變量,例如:{'name': 'jay'};
globals 依然是獲取全局變量;
全局變量沒法獲取局部做用域中的變量,反之亦然,兩者是相互獨立的,可是全局變量能夠獲取在全局定義的函數、類、變量等;function
(3)locals 和 globals 都在局部做用域中class
def func(): name = 'jay' age = 20 print(locals()) print(globals()) print('name' in globals()) func() # 執行結果: # {'age': 20, 'name': 'jay'} # {'func': <function func at 0x0000024665227268>, '__name__': '__main__'......} # False
分析:
locals 和 globals 都在局部做用域中
locals 獲取的僅僅是當前局部做用域中的變量,例如:{'name': 'jay'};
globals 依然是獲取全局變量;
全局變量沒法獲取局部做用域中的變量,反之亦然,兩者是相互獨立的,可是全局變量能夠獲取在全局定義的函數、類、變量等;test
總結:
locals 和 globals 內置函數
locals 是獲取當前環境可用的變量,若是 locals 在全局做用域中調用,獲取的就是全局做用域中的變量,若是在局部做用域中調用,獲取的就是局部做用域中的變量
globals 是獲取全局環境中可用的變量,不管 globals是在全局中仍是在局部中調用,獲取到的必定是全局做用域中的變量,且 globals 和 locals 是相互獨立的存在
接下來,在分析下 nonlocal 和 global 的使用
要記住在 python 中引用變量的順序:
當前做用域局部變量 --> 外層做用域變量 --> 當前模塊中的全局變量 --> python內置變量
global關鍵字用來在函數或者其餘局部做用域中使用全局變量,可是若是不修改全局變量是能夠不實用global關鍵字
(1)僅僅只是查看使用全局變量,不作任何修改
name = 'hkey' def func(): print('局部變量 name:', name) # 根據pyton引用變量的順序,在全局做用域中找到了 name 變量 func() print('全局變量 name:', name) # 執行結果: # 局部變量 name: hkey # 全局變量 name: hkey
(2)獲取全局變量,並修改全局變量
name = 'hkey' def func(): global name # 經過 global 關鍵字獲取全局變量 name name = 'jay' # 由於上面有 global 獲取換全局變量 name 全部這裏對全局變量 name 進行操做 func() print('name:', name) # 執行結果: # name: jay
(3)全局變量和局部變量同名的表現形式
name = 'hkey' def func(): name = 'jay' # 在局部做用域中直接定義了 name 變量,所以在局部獲取 name 變量的時候,根據引用順序,直接就從局部獲取 print('局部變量 name: ', name) func() print('全局變量 name:', name) # 全局變量未更改 # 執行結果: # 局部變量 name: jay # 全局變量 name: hkey
global 總結:
global 是用來在局部做用域中引用python全局變量的
a. 當局部僅僅只是查看使用,可直接調用全局中的變量
b. 當局部須要修改全局變量,則須要使用 global 來獲取全局變量
c. 定義局部變量的時候,應該儘可能變量和全局變量重名
nonlocal關鍵字用來在函數或其餘做用域中使用外層(非全局)變量,nonlocal是沒法獲取全局變量的
(1)僅僅只是查看使用外層(非全局)變量,不作任何修改
def func(): name = 'hkey' def foo(): print('函數foo 局部變量 name:', name) # 根據 python 引用變量的原則,不修改變量時能夠直接獲取 return foo f = func() f() # 執行結果: # 函數foo 局部變量 name: hkey
(2)獲取外層(非全局)變量,並修改外層(非全局)變量
def func(): name = 'hkey' def foo(): nonlocal name # 使用 nonlocal 關鍵字,獲取外層(非全局)變量 name = 'jay' # 修改外層(非全局)變量 print('函數foo 局部變量 name:', name) return foo f = func() f() # 執行結果: # 函數foo 局部變量 name: jay
nonlocal 總結:
僅僅只能獲取外層(非全局)變量,獲取全局變量會報錯
globals() 和 locals(): (1)兩者都是 python 內置函數 (2)globals 不管在全局仍是局部都是用來獲取全局變量的,而 locals 會隨着做用域的不一樣獲取不一樣做用域的變量global 和 nonlocal 是 python 內部關鍵字, global 是用來在局部做用域獲取全局變量的 nonlocal 是用來在局部獲取外層(非全局)變量,兩者是不一樣的。