不为成仙,只为在这红尘中等你回来。

您现在的位置是:网站首页>>Python

Python global、nonlocal

2020年4月17日 15:51 | 分类:Python | 标签: Python

先看个小栗子

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