Menu Close

python全局变量和非局部变量的区别

全局变量和非全局变量
全局变量和非全局变量

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自始至终指向同一个空间地址。

 

 

除教程外,本网站大部分文章来自互联网,如果有内容冒犯到你,请联系我们删除!

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Leave the field below empty!

Posted in Python教程