python中全局global和局部nonlocal命名空间

python中全局global和局部nonlocal命名空间

局部名称空间对全局名称空间的变量可以引用,但是无法改变。

count = 1
def func1():
    count = 2
    print(count)
func1()
count = 1
def func1():
    # count = 3
    count = count + 1  # local variable 'count' referenced before assignment
    print(count)
func1()

报错原因:如果你在局部名称空间 对一个变量进行修改,那么解释器会认为你的这个变量在局部中已经定义了,但是对于上面的例题,局部中没有定义,所以他会报错。

一. global

global关键字修饰变量后标识该变量是全局变量,对该变量进行修改就是修改全局变量

count = 1
def func1():
    global count	#在局部名称空间声明一个全局变量。
    count = count + 1	#在局部名称空间声明可以对全局变量进行修改。
    print(count)
func1()
print(count)

输出:

2
2

二. nonlocal

1. 子函数对父函数的变量进行修改
2. 此变量不能是全局变量
3. 在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。

def func1():
    count = 666
    def inner():
        print(count)
        def func2():
            nonlocal count
            count += 1
            print("func2",count)
        func2()
        print("inner",count)
    inner()
    print("funcl",count)
func1()

输出:

666
func2 667
inner 667
funcl 667
posted @ 2019-11-27 10:16  我的初衷  阅读(224)  评论(0编辑  收藏  举报