Python global、nonlocal

先看个小栗子

a = 1
def func1():
    print(a) # 1
func1()

#############################
b = 100
def func2():
    b += 1 # 报错 UnboundLocalError: local variable 'b' referenced before assignment
func2()

局部作用域对全局作用域的变量(此变量只能是不可变的数据类型只能进行引用,而不能进行改变,只要改变就会报错,但是有些时候,我们程序中会遇到局部作用域去改变全局作用域的一些变量的需求,这怎么做呢?这就得用到关键字 global。

global 作用

  • 1.声明一个全局变量。

      def func():
          global a
          a = 3
      func()
      print(a)  # 3
    
  • 2.在局部作用域想要对全局作用域的全局变量进行修改时,需要用到 global(限于字符串,数字)。

      count = 1
      def search():
          global count
          count = 2
      search()
      print(count)  # 2
    

nonlocal 作用

nonlocal 是 Python3.x 新加的功能,与 global 用法差不多,就是在局部作用域中如果想对父级作用域的变量进行改变时,需要用到 nonlocal。

  • 1.不能更改全局变量。

      count = 666
      
      
      def func1():
          def func2():
              nonlocal count # SyntaxError: no binding for nonlocal 'count' found
              count += 1
              print(count)
      
          func2()
      
      
      func1()
    
  • 2.在局部作用域中,对父级作用域(或者更外层作用域,非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。

      def func1():
          count = 666
      
          def inner():
              print(count)
      
              def func2():
                  nonlocal count
                  count += 1
                  print('func2', count)
      
              func2()
              print('inner', count)
      
          inner()
          print('func1', count)
      
      
      func1()
      # 运行结果:
      # 666
      # # func2 667
      # # inner 667
      # # func1 667
    

你可能感兴趣的:(Python3,python)