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;
'''

 

posted @ 2022-11-03 16:05  yudai  阅读(41)  评论(0编辑  收藏  举报