python——global和nonlocal详解

global

简介

global关键字用来在函数或其他局部作用域中使用全局变量。

global作用域是全局的,就是会修改这个变量对应地址的值。

注意

  • global 语句是一个声明,它适用于整个当前代码块。 这意味着列出的标识符将被解释为全局变量。 尽管自由变量可能指的是全局变量而不被声明为全局变量。

  • global 语句中列出的名称不得用于该全局语句之前的文本代码块中。

  • global 语句中列出的名称不能定义为形式参数,也不能在 for 循环控制目标、 class 定义、函数定义、 import 语句或变量注释中定义。

  • 当前的实现并不强制执行这些限制,但是程序不应该滥用这种自由,因为未来的实现可能会强制执行这些限制,或者悄悄地改变程序的含义。

示例

global关键字用来在函数或其他局部作用域中使用全局变量。但是如果不修改全局变量也可以不使用global关键字。

count = 0
def global_test():
  gcount+=1
  print (count)
global_test()

以上代码会报错:第一行定义了全局变量,在内部函数中又对外部函数进行了引用并修改,那么python会认为它是一个局部变量,又因为内部函数没有对其count进行定义和赋值,所以报错。

如果局部要对全局变量修改,则在局部声明该全局变量。

count = 0
def global_test():
  global count
  count+=1
  print (count)
global_test() #1
print(count) #1

如果局部不声明全局变量,并且不修改全局变量,则可以正常使用。

count = 0
def global_test():
  print (count)
global_test() #0

global只修改内部作用域的值并不修改外部作用域的值

def outer():
    num = 10
    def inner():
        global num   
        num = 100
        print(num)
    inner()
    print(num)
outer()
#100
#10

从结果我们可以看出来,global定义的关键字并不会向上一层群寻找嵌套的函数,它的作用就是让当前域的变量是可以发生改变的而并不会像nonlocal一样去改变外部的值。

def outer():
    global num
    num = 10
    
    def inner():
        global num   # nonlocal关键字声明
        num = 100
        print(num)
    inner()
    print(num)
outer()

#100
#100

如果当外部函数的作用变量也是用global定义的,那么就是全局变量了,再inner函数中就可以修改它了。

nonlocal

简介

nonlocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量。

注意

  • nonlocal只在闭包里面生效,作用域就是闭包里面的,外函数和内函数都影响,但是闭包外面不影响。

  • nonlocal 语句使列出的标识符引用除 global 变量外最近的封闭范围中的以前绑定的变量。 这很重要,因为绑定的默认行为是首先搜索本地名称空间。 该语句允许封装的代码将变量重新绑定到除全局(模块)作用域之外的本地作用域之外。

  • nonlocal 语句中列出的名称与 global 语句中列出的名称不同,它们必须引用封闭范围中已经存在的绑定(无法明确确定应在其中创建新绑定的范围)。

示例

a=100
print('全局变量',a)
def test1():
    nonlocal a
    a=200
    print('test1中修改全局变量a',a)
def test2():
    print('tes2中使用全局变量',a)
test1()
test2()

报错,因为没有嵌套一个函数。

def outer():
    num = 10
    def inner():
        nonlocal num   # nonlocal关键字声明
        num = 100
        print(num)
    inner()
    print(num)
outer()
#100
#100

使用nonlocal关键字修改了num的值,inner这个函数会往上面去找一个局部变量num,然后修改num的值。

def make_counter():
  count = 0
  def counter():
    nonlocal count
    count += 1
    return count
  return counter   
def make_counter_test():
 mc = make_counter()
 print(mc()) 
 print(mc()) 
 print(mc()) 
make_counter_test() # 1 2 3
posted @ 2022-06-14 11:27  岸南  阅读(262)  评论(0)    收藏  举报