1. python全局变量和非局部变量的区别
1.Global 语句允许在局部范围内修改全局变量,而非局部语句允许在局部范围内修改封闭范围变量。
要在局部范围内修改全局变量,我们必须先用 global 语句声明变量。类似地,如果我们希望在本地范围内修改封闭范围变量(或嵌套范围变量),我们应该首先使用 nonlocal 语句声明它。
nonlocal 语句对封闭范围变量的作用与 global 语句对全局变量的作用相同。 nonlocal 是 global 声明的对应。
在调用 func() 之后,“gb”和“esv”的值即使在本地范围之外也会发生变化。
2.使用 nonlocal 声明的名称必须预先存在,但可以使用新名称声明 global
global 语句可以用现有的全局变量或新变量声明,但 nonlocal 语句仅限于预先存在的变量。
最后一个语句“nonlocal nl”是一个错误,因为 nl 并不预先存在。如果您运行代码,您将收到消息“SyntaxError: no binding for nonlocal ‘nl’ found”。
nonlocal 语句导致列出的标识符引用最近的封闭范围内的先前绑定的变量。这很重要,因为绑定的默认行为是首先搜索本地命名空间。该语句允许封装代码重新绑定全局(模块)范围之外的局部范围之外的变量。
与全局语句中列出的名称不同,非本地语句中列出的名称必须引用封闭范围中的预先存在的绑定(无法明确确定应创建新绑定的范围)。
非本地语句中列出的名称不得与本地范围内的预先存在的绑定冲突。
- 局部变量作用在函数范围内,如果超出函数的作用范围,则对局部变量所作的操作,都将‘’失效“。
- 全局变量在函数内访问,但是要修改的话,需要加global关键字,这样对全局变量的操作不会因为超出函数范而”失效“。
- nonlocal关键字可将局部变量转为非局部变量,这样就可以在嵌套的函数内访问和修改。
2. 范例说明全局变量和非局部变量的区别
例2.1 嵌套函数中变量的应用
def fun(): var1 = 10 def gun(): print(var1) var2 = var1 + 1 print(var2) gun() fun()
result
10
11
变量 var1 具有整个 fun() 的范围。它将可以从 fun() 的嵌套函数中访问.
例2.2 调用局部变量和它的ID值
def fun(): var1 = 10 def gun(): # gun() initializes a new variable var1. var1 = 20 print(var1, id(var1)) print(var1, id(var1)) gun() fun()
results:
10 2226588549648
20 2226588549968
在这种情况下,gun() 在 gun 范围内初始化了新变量 var1。值为 10 的 var1 和值为 20 的 var1 是两个不同且唯一的变量。默认情况下,将在 gun() 中访问 var1 保持值 20。
例2.3 非局部变量的调用
def fun(): var1 = 10 def gun(): # tell python explicitly that it # has to access var1 initialized # in fun on line 2 # using the keyword nonlocal nonlocal var1 var1 = var1 + 10 print(var1) gun() fun()
结果
20
在2.3例中,在 gun() 中初始化 var1 之前。我们已经明确告诉 Python,不要初始化新变量,而是访问第 2 行已经存在的 var1。使用关键字 nonlocal 因此,当解释器执行加法时,它访问值 10(已经存在)并避免错误。
现在让我们继续讨论 global 关键字全局变量。考虑下面给出的例子
例2.4 全局变量
var1 = 10 def fun(): # global variable var1 will # be read or accessed in fun() print('var1 is', var1) fun()
results:
var1 is 10
例2.5 全局变量 var1 将在函数 fun() 中简单地读取或访问.
var1 = 10 def fun(): # new local variable var1 # will be initialized in fun() var1 = 20 print('var1 is', var1) print('var1 is at', id(var1)) fun() print('var1 is', var1) print('var1 is at', id(var1))
results:
var1 is 20
var1 is at 1634653242192
var1 is 10
var1 is at 1634653241872
从例2.5可以看出,全局变量VAR1自始至终指向同一个空间地址。