📜  在Python中使用 nonlocal 与使用 global 关键字

📅  最后修改于: 2022-05-13 01:55:24.772000             🧑  作者: Mango

在Python中使用 nonlocal 与使用 global 关键字

先决条件: Python中的全局变量和局部变量
在转到Python中的非本地和全局之前。让我们考虑嵌套函数中的一些基本场景。

Python3
def fun():
    var1 = 10
 
    def gun():
        print(var1)
        var2 = var1 + 1
        print(var2)
 
    gun()
fun()


Python3
def fun():
    var1 = 10
 
    def gun():
        # gun() initializes a new variable var1.
        var1 = 20
        print(var1, id(var1))
 
    print(var1, id(var1))
    gun()
fun()


Python3
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()


Python3
var1 = 10
def fun():
    # global variable var1 will
# be read or accessed in fun()
    print('var1 is', var1)
 
fun()


Python3
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))


Python3
var1 = 10
def fun():
    # tell python explicitly do not
    # initialise a new variable
    # instead access var1 which
    # has global scope
    global var1
    var1 = var1 + 20
    print('var1 is', var1)
 
fun()


输出:
10
11

变量var1具有整个 fun () 的范围。它将可以从 fun() 的嵌套函数中访问

Python3

def fun():
    var1 = 10
 
    def gun():
        # gun() initializes a new variable var1.
        var1 = 20
        print(var1, id(var1))
 
    print(var1, id(var1))
    gun()
fun()
输出:
10 10853920
20 10854240

在这种情况下gun()在 gun 的范围内初始化了新变量 var1 。值为 10 的 var1 和值为 20 的 var1 是两个不同且唯一的变量。默认情况下,将在 gun() 中访问 var1 保持值 20。

考虑前面的例子,我们知道 guns 会在自己的作用域内初始化一个新的变量 var1。但是当它要这样做时,它还找不到 var1 的值,
执行算术运算,因为之前在 gun() 中没有为 var1 分配任何值。

Python3

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

在本例中,在 gun() 中初始化 var1 之前。我们已经明确告诉Python ,不要初始化新变量,而是访问第 2 行已经存在的 var1。使用关键字nonlocal因此,当解释器执行加法时,它访问值 10(已经存在)并避免错误。

现在让我们继续讨论 global 关键字。考虑下面给出的例子

Python3

var1 = 10
def fun():
    # global variable var1 will
# be read or accessed in fun()
    print('var1 is', var1)
 
fun()
输出:
var1 is 10

全局变量 var1 将在函数fun() 中简单地读取或访问

Python3

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))
输出:
var1 is 20
var1 is at 10854240
var1 is 10
var1 is at 10853920

一个新的变量 var1 将在 fun() 中初始化。全局变量 var1 将不同于 fun() 的局部变量 var1。默认情况下,在 fun() 中,将访问局部变量。

考虑前面的例子,我们知道 fun() 将在自己的范围内初始化一个新变量 var1。但是当它要这样做时,它还找不到 var1 的值,
执行算术运算,因为之前在 fun() 中没有为 var1 分配任何值

Python3

var1 = 10
def fun():
    # tell python explicitly do not
    # initialise a new variable
    # instead access var1 which
    # has global scope
    global var1
    var1 = var1 + 20
    print('var1 is', var1)
 
fun()
输出:
var1 is 30

在这个例子中,在 fun() 中初始化 var1 之前。我们已经明确告诉Python ,不要初始化新变量,而是访问已经在第 1 行出现的 var1。使用关键字global所以当解释器执行加法时,它访问值 10(已经存在),并且避免了错误。