Python函數命名空間和作用域(Local與Global)

摘要:

Python函數是一個包裝起來的代碼塊,通過前面的返回函數,閉包函數等課程,我們發現其內部變量定義在不同的位置,使用起來的效果就有所不同,這就是python函數的作用域和命名空間。

1.Local作用域

a = 100
def func5():
    b = 50
    a = 99
    print('函數內a', a)
    print('函數內b', b)

print('函數外a', a)
func5()
print('函數外b', b)

返回結果:

函數外a 100
函數內a 99
函數內b 50
Traceback (most recent call last):
  File "C:/Users/Administrator/Desktop/python知識總結/2.python自學網-通用模塊-視頻源碼/test.py", line 12, in <module>
    print('函數外b', b)
NameError: name 'b' is not defined

上面函數中定義b變量,所以外面無法輸出。

2.Enclosing function locals作用域

a = 100
def func5():
    b = 50
    print('函數內a', a)
    print('函數內b', b)
    def func6():
        print('下層函數內a', a)
        print('下層函數內b', b)
    func6()
func5()

返回結果:

函數內a 100
函數內b 50
下層函數內a 100
下層函數內b 50

3.Global全局變量

a = 123
def func():
    a = 100
    print(a)
print(a)
func()
print(a)

a = 123
def func():
    global a  # 這裡不能使用nonlocal
    a = 100
    print(a)
    print(locals())  # 查看局部變量
    print(globals())  # 查看全局變量
print(a)
func()
print(a)

4.非局部變量nonlocal

def func5():
    b = 50
    print(b)
    def func6():
        nonlocal b  # 非局部的,隻適用於閉包內部
        b = 60
        print(b)
    func6()
    print(b)
func5()

5.就近原則

b = 1111
def func5():
    b = 50
    print(b)
    def func6():
        b = 60
        print(b)  # 這裡的b從內到外究竟查找
    func6()
    print(b)
func5()


a = 100
def func5():
    b = 50
    print(a)
    print(b)
    def func6():
        b = 60
        print(b)
        print(a)
func5()

6.函數執行順序

a = 123
def func1():
    print(a)
    print(b)
func1()  # 不能打印b
b = 456
func1()  # 可以打印b

7.循環、判斷代碼塊中作用域問題

if True:
    a = 100
print(a)


for i in range(1, 10):
    print(i)
print(i)

循環代碼塊中沒有作用域這樣的情況。

到此這篇關於Python函數命名空間和作用域(Local與Global)的文章就介紹到這瞭,更多相關Python命名空間和作用域內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: