python——global与nonlocal关键字

global and nonlocal


使用这两个关键字之前,我们先了解一下什么是变量的作用域

  • 变量的作用域:是指一个变量所产生的作用范围,也就是说在哪一个范围内变量能够被解释器所识别。
  • 变量分为:全局变量and局部变量
  • 全局变量的作用域:全局变量一般声明在函数的外部。整个.py文件内都可以使用,都可以被识别。
  • 局部变量的作用域:只能在函数的内部使用,超出范围,变量就不能再使用

> global关键字

用来在函数或其他局部作用域中使用全局变量,如果不修改全局变量也可以不使用global关键字。global关键字修饰变量后标识该变量是全局变量,对该变量进行修改就是修改全局变量
number = 0 
def small_test():
    number += 1
    print (number)
small_test()

UnboundLocalError: local variable ‘number’ referenced before assignment
局部变量错误:局部变量“number”在赋值前被引用

如果内部函数有引用外部函数的同名变量或者全局变量,并且对这个变量有修改.那么python会认为它是一个局部变量,又因为函数中没有gcount的定义和赋值,所以报错。

如果在局部要对全局变量修改,需要在局部也要先声明该全局变量(如下代码)
number = 0 
def small_test():
    global number    # 声明变量number为全局变量
    number += 1
    print (number)   # 1
small_test()
print(number)        # 1

在局部如果不修改全局变量,则可以正常使用全局变量(如下代码)
number = 0
def small_test():
    print(number)
small_test()

> nonlocal关键字

nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量,修饰变量后标识该变量是上一级函数中的局部变量,如果上一级函数中不存在该局部变量,nonlocal位置会发生错误(最上层的函数使用nonlocal修饰变量必定会报错)。
def make_counter(): 
    number = 0 
    def counter(): 
        nonlocal number 
        number += 1 
        return number 
    return counter 
def small_test(): 
  m = make_counter() 
  print(m())   	# 1
  print(m())	# 2
  print(m())	# 3
  print(m())	# 4
small_test()

总结

  • global

  1. global 表示将变量声明为全局变量
  2. 在嵌套函数中,使用父级函数中的变量,只能在子函数内引用,如果要在子函数内修改,必须在子函数里面声明 “global 变量”,表明是修改外面的全局变量
  3. global 定义的变量,表明其作用域在局部以外,即局部函数执行完之后,不销毁函数内部以global定义的变量
  • nonlocal

  1. nonlocal 表示将变量声明为外层变量(外层函数的局部变量,而且不能是全局变量)

你可能感兴趣的:(python——global与nonlocal关键字)