Python 中 global 和 nonlocal 的区别

Python 中 global 和 nonlocal 的区别

学习记录

个人自学 python 的记录总结,希望有大佬看见不正确的地方,请指点我一下,谢谢

global 和 nonlocal 的区别

"""
global 和 nonlocal 的区别
"""
spam = "全局变量 spam"


def scope_test():
	# 函数内部的定义一个局部变量
    spam = "scope_test() 中的变量 spam"
    
    def do_local():
        # 只在 do_local() 中有效的局部变量
        spam = "do_local() --> spam"

    def do_nonlocal():
        # 将spam 变量绑定到上一层函数的同名变量
        # 若上层函数没有这个变量运行时会报错
        # 即 绑定到 scope_test() 中定义的 spam 变量
        # 在此方法中赋值后会修改 scope_test() 中 spam 的值
        nonlocal spam
        spam = "do_nonlocal()修改 scope_test()中的变量 spam"

    def do_global():
        # 将 spam 变量绑定到同名的全局变量或者创建全局变量
        # 此时的 spam 变量和 scope_test()中的 spam 是两个两个变量
        # 在此方法中赋值后会修改此模块中 spam 的值
        global spam
        spam = "do_global()修改了模块中的变量 spam"

    do_local()
    print(2, spam)
    do_global()
    print(3, spam)
    do_nonlocal()
    print(4, spam)


print(1, spam)
scope_test()
print(5, spam)

输出结果:


1 全局变量 spam
2 scope_test() 中的变量 spam
3 scope_test() 中的变量 spam
4 do_nonlocal()修改 scope_test()中的变量 spam
5 do_global()修改了模块中的变量 spam

总结:

global 修饰的变量

  1. global 修饰的变量会绑定到模块中事先定义的同名全局变量,若事先没有定义这个变量会创建这个变量。
  2. 在函数中修改了被 global 修饰的变量不会修改到函数中的同名变量。

nonlocal 修饰的变量

  1. 只能在嵌套函数中使用

  2. nonlocal 修饰的变量会绑定到上层函数中修饰的同名变量,若上层函数中没有声明这个变量,则在运行时会报错。

  3. 若在多层嵌套中使用 nonlocal 修饰变量,那么优先绑定的是上层函数中的变量,当上层函数中没有同名变量的时候才绑定到上上层函数中同名变量句号
    例:

    def test_nonlocal():
    
        spam = "spam"
    
        def test1():
            spam = "test1_spam"
            print("test1()中的 spam=", spam)
    
            def test2():
                nonlocal spam
                spam = "修改 spam"
    
            test2()
            print("test1()中的 spam=", spam)
    
        print("test_nonlocal() 中的 spam=", spam)
        test1()
        print("test_nonlocal() 中的 spam=", spam)
    
    
    test_nonlocal()
    
    

    输出结果:

    
    test_nonlocal() 中的 spam= spam
    test1()中的 spam= test1_spam
    test1()中的 spam= 修改 spam
    test_nonlocal() 中的 spam= spam
    
    

    若把 test1() 函数中的 spam 注释掉得到的结果是:

    
    test_nonlocal() 中的 spam= spam
    test1()中的 spam= spam
    test1()中的 spam= 修改 spam
    test_nonlocal() 中的 spam= 修改 spam
    
    

你可能感兴趣的:(python,基础,python,学习记录,Python,中,global,和,nonlocal,的区别)