Python global 和 nonlocal 使用
数字、字符串、元祖修改全局变量时需要加 global
列表和字典 默认为全局变量,则不需要 global 声明
nonlocal是将局部变量转为上一级函数的局部变量
# nonlocal使用 name = "我是最外层:aaa" # 全局变量 print(f"我是最外层name{name},id:{id(name)},只要不修改,不会被重新分配内存地址") def get_name1(): name = "我是get_name1:bbb" # 因为没用global 声明,故是局部变量 print(f"我是get_name1的name{name},id:{id(name)}") def get_name2(): nonlocal name name = "我是get_name2:ccc" # 因为string 是不可变对象,修改有会开辟新的地址存储 print(f"我是get_name2修改后的name{name},id:{id(name)}") get_name2() print(f"我是get_name1 修改后的的name{name},id:{id(name)}") get_name1() print(f"我是最外层name{name},id:{id(name)}") """ 我是最外层name我是最外层:aaa,id:140420098952912 我是get_name1的name我是get_name1:bbb,id:140420098821040 我是get_name2修改后的name我是get_name2:ccc,id:140420099270448 我是get_name1 修改后的的name我是get_name2:ccc,id:140420099270448 我是最外层name我是最外层:aaa,id:140420098952912 """
# global 全局变量使用 def test1(): a = 1 print(f"test1:这是全局变量a的值{a}和id:{id(a)}") def test2(): a = 5 print(f"test2:这是局部变量a的值{a}和id:{id(a)}") def test3(): print(f"test3:这是全局变量a的值{a}和id:{id(a)};只读取,未赋值,不用声明全局变量") def test4(): global a a = 3 print(f"test4:全局变量赋值需要global声明,a为{a}和id:{id(a)};") # 因为num为不可变类型,重新赋值会分配新的地址 test2() test3() test4() test1() ''' 输出: test1:这是全局变量a的值1和id:140593850358064 test2:这是局部变量a的值5和id:140593850358192 test3:这是全局变量a的值1和id:140593850358064;只读取,未赋值,不用声明全局变量 test4:全局变量赋值需要global声明,a为3和id:140593850358128; '''