在上一篇文章中,我们介绍了命名空间的概念以及它们带来的一些特性。让我们利用这一点来剖析Python中的两个关键字:global和nonlocal。两者都允许您更改程序中变量的命名空间以更改其默认状态。
由于这两个关键字在开发过程中被频繁使用,因此系统地了解它们的内在原理是非常有用的。
global
在日常开发中,经常使用global关键字来声明函数内使用的全局变量。全局定义的变量在函数内是只读的,并且其值不能更改。这是因为函数的内部变量和全局变量属于两个不同的命名空间。因此,在修改函数内的变量之前,必须将函数内的变量指定为全局变量。
# 定义全局变量name='python' def func(): # 在函数中指定变量为全局全局名# 更改变量name='java' # 输出两个命名空间的内容print(f'global={ globals() }') print(f'local={locals()}')# 运行函数func()# 打印全局变量print(name)# Global={.'name': ' java'},忽略无用信息# local={}# 在上面的代码中,java使用global关键字来定义一个全局变量名,并在函数内部更改名称。这表明name是一个全局变量,name的值是可以改变的。 从输出中可以看到, name 是在全局命名空间中定义的,但也在函数内部声明,但不在本地命名空间中。这表明使用global 关键字所做的更改本质上是相同的。 在全局命名空间中定义。
全局关键字
nonlocal
非局部主要用于嵌套函数,其中内部函数引用外部函数并更改其值,但保留局部变量的范围,以便外部函数定义的变量值被内部函数更改。本质上,非本地与将外部变量直接引用到内部命名空间相同。可以从下面的代码中确认。
# 定义外部函数def inner_func(): # 定义外部函数变量x=50 # 打印命名空间的内容print(f'external={locals()}') # 打印变量的内存地址print(hex( id(x))) def inner_func(): # 使用nonlocal改变同名变量。 nonlocal x # 打印内部函数命名空间的内容。 print(f'internal={locals()}') # 打印x 的内存地址。 print(hex( id(locals()[' x']))) # 调用内部函数inner_func()# 执行外部函数external_func()# 执行结果# external={'x': 50}#0x7ff8e8c3cfd8# Internal={ 'x ': 50}#0x7ff8e8c3cfd8 在上面的代码中,我们可以得出结论,该变量本质上是引用了一个外部函数变量(2两者输出的内存地址是相同的(0x7ff8e8c3cfd8)(你的实际结果可能与结果不同)此处显示)。您可以进一步检查)。
在Python中,本地命名空间已经是最小范围的,因此外部和内部函数都有自己的命名空间。
非本地关键字
总结
由于Python内部操作的性质,global和nonlocal这两个关键字会更改变量所属的命名空间并更改变量的原始状态。标记为全局的变量会创建由全局命名空间引用的局部变量,标记为非局部的变量会导致内部函数引用外部函数中的变量。 nonlocal 只影响嵌套函数内的变量,全局变量保持不变(这一点非常重要)。即使需要使用全局变量,也必须使用global关键字。在内部函数中使用非局部变量之前,必须确保外部函数中定义了同名变量。如果没有定义,会报语法错误。 #第一篇文章挑战#
版权声明:本文转载于网络,版权归作者所有。如有侵权,请联系本站编辑删除。