100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > python的作用域 gbel_[ python ] 全局和局部作用域变量的引用

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

时间:2022-09-13 02:22:26

相关推荐

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

全局与局部变量的引用

(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': }

# 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': , '__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 是用来在局部获取外层(非全局)变量,二者是不同的。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。