1. 程式人生 > 實用技巧 >python中global和nonlocal的使用

python中global和nonlocal的使用

global: 在區域性訪問全域性中的內容
nonlocal: 在區域性尋找外層函式中離他最近的那個變數

globals() 檢視全域性中的內容
locals() 檢視當前作用域中的內容

1、global的使用:

# 全域性變數本身就是不安全的, 不能隨意修改, 可以使用閉包
a = 10


def func():
    """
    :return:
    global的作用:
    1. 可以把全域性中的內容引入到函式內部
    2. 在全域性建立一個變數
    """
    global a
    a += 10
    print(a)


func()
print(a)

執行結果為:

20
20

2、nonlocal的使用:

def outer():
    a = 10

    # 在inner中改變a的值
    def inner():
        # 尋找外層函式中離他最近的那個變數
        nonlocal a
        a = 20
        print(a)

    print(a)
    inner()


outer()

執行結果:

10
20

3、globals和locals的使用:

def fn():
    a = 10

    def gn():
        b = 20
    gn()
    
print(locals()) fn() print(locals()) print(globals())

執行結果:

{'gn': <function fn.<locals>.gn at 0x0000012239A68C80>, 'a': 10}
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000012237DCB438>, '__spec__': None, '
__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:/learnpj/oldboy/day11/global和nonlocal.py', '__cached__': None, 'i': 10, 'fn': <function fn at 0x0000012237D71E18>} {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000012237DCB438>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:/learnpj/oldboy/day11/global和nonlocal.py', '__cached__': None, 'i': 10, 'fn': <function fn at 0x0000012237D71E18>}

練習題:

a = 1
def fun_1():
    a = 2
    def fun_2():
        global a
        a = 3
        def fun_3():
            a = 4
            print(a)
        print(a)
        fun_3()
        print(a)
    print(a)
    fun_2()
    print(a)
print(a)
fun_1()
print(a)
a = 1
def fun_1():
    a = 2
    def fun_2():
        nonlocal a
        a = 3
        def fun_3():
            a = 4
            print(a)
        print(a)
        fun_3()
        print(a)
    print(a)
    fun_2()
    print(a)
print(a)
fun_1()
print(a)

以上兩道練習題的輸出結果分別是什麼,請自行理解並輸出一下!