函數【二】嵌套/做用域/名稱空間

py_函數進階

 

一函數的註釋

          官方推薦
#   查看註釋: func名.__doc__
#   查看註釋: func名.__name__

二嵌套函數

# 第一種函數嵌套 在函數func內
# def func():
#     print(3)
#     def f():
#         print(1)
#     print(2)
#     f()
# func()


# 第二種函數嵌套 多個函數嵌套調用
# def func():
#     a = 1
#     def log():
#         a = 5
#         def info():
#             a = 10
#             print(a)
#         print(a)
#     print(a)
# func()
View Code

三名稱空間

一 名稱空間的加載順序html

python test.py
#一、python解釋器先啓動,於是首先加載的是:內置名稱空間
#二、執行test.py文件,而後以文件爲基礎,加載全局名稱空間
#三、在執行文件的過程當中若是調用函數,則臨時產生局部名稱空間

二 名字的查找順序python

局部名稱空間--->全局名稱空間--->內置名稱空間

#須要注意的是:在全局沒法查看局部的,在局部能夠查看全局的,以下示例

# max=1
def f1():
    # max=2
    def f2():
        # max=3
        print(max)
    f2()
f1()
print(max)
名稱空間
        #     加載順序:
        #         1.內置空間
        #         2.全局空間
        #         3.局部空間
        #     取值順序:
        #        1.局部空間
        #        2.全局空間
        #        3.內置空間

四做用域

# 全局做用域  內置 + 全局
# 局部做用域 局部

# global : 在局部修改所有變量,若是沒有就建立一個新的.建立後的只能賦值,
# nonlocal : 在局部空間內,修改離本身最近的變量,若是上一層沒有就繼續向上找,
# 直到找到局部變量的頂層,局部空間內沒有能夠修改的變量,就報錯
全局變量中沒有a,用global 則會建立一個,建立後不可修改,
def test():
    global a
    a = 10
test()
print(a)

def test():
    global a
    a += 10
test()
print(a)

NameError: name 'a' is not defined   不可修改
複製代碼
#一、做用域即範圍
        - 全局範圍(內置名稱空間與全局名稱空間屬於該範圍):全局存活,全局有效
      - 局部範圍(局部名稱空間屬於該範圍):臨時存活,局部有效
#二、做用域關係是在函數定義階段就已經固定的,與函數的調用位置無關,以下
x=1
def f1():
    def f2():
        print(x)
    return f2
x=100
def f3(func):
    x=2
    func()
x=10000
f3(f1())

#三、查看做用域:globals(),locals()


LEGB 表明名字查找順序: locals -> enclosing function -> globals -> __builtins__
locals 是函數內的名字空間,包括局部變量和形參
enclosing 外部嵌套函數的名字空間(閉包中常見)
globals 全局變量,函數定義所在模塊的名字空間
builtins 內置模塊的名字空間

做用域
做用域
相關文章
相關標籤/搜索