1. 程式人生 > >[ python ] 全局和局部作用域變量的引用

[ python ] 全局和局部作用域變量的引用

.... 形式 ron pytho clas 引用 spa 函數 strong

全局與局部變量的引用

(a)locals
(b)globals

這裏還需要在補充2個關鍵字一起比較學習,關鍵字:
(c)nonlocal
(d)global

locals 和 globals

locals: 打印當前可用的變量的字典
globals: 返回一個描述當前全局變量的字典

提示:locals 是獲取當前的可用變量,而 globals 是獲取全局的變量

在使用 locals() 和 globals() 會出現以下三種表現形式:

(1)當locals 和 globals 都在全局作用域的時候,獲取的可用環境變量是一致的

print(globals() == locals())
print(locals())
print(globals())

# 執行結果:
# True
# {‘__cached__‘: None, ‘__doc__‘: None, ......}
# {‘__cached__‘: None, ‘__doc__‘: None, ......}

分析:
locals 和 globals 都在全局作用域中時,二者獲取到的變量是一致的。

(2)當 locals 在局部作用域中,而 globals 在全局作用域中

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 依然是獲取全局變量;
全局變量無法獲取局部作用域中的變量,反之亦然,二者是相互獨立的,但是全局變量可以獲取在全局定義的函數、類、變量等;

(3)locals 和 globals 都在局部作用域中

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 依然是獲取全局變量;
全局變量無法獲取局部作用域中的變量,反之亦然,二者是相互獨立的,但是全局變量可以獲取在全局定義的函數、類、變量等;

總結:

locals 和 globals 內置函數

locals 是獲取當前環境可用的變量,如果 locals 在全局作用域中調用,獲取的就是全局作用域中的變量,如果在局部作用域中調用,獲取的就是局部作用域中的變量
globals 是獲取全局環境中可用的變量,無論 globals是在全局中還是在局部中調用,獲取到的一定是全局作用域中的變量,且 globals 和 locals 是相互獨立的存在

接下來,在分析下 nonlocal 和 global 的使用

要記住在 python 中引用變量的順序:
當前作用域局部變量 --> 外層作用域變量 --> 當前模塊中的全局變量 --> python內置變量

技術分享圖片

global 的使用

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關鍵字用來在函數或其他作用域中使用外層(非全局)變量,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 是用來在局部獲取外層(非全局)變量,二者是不同的。

[ python ] 全局和局部作用域變量的引用