十、Python 命名空間和作用域

1、命名空間

I) 定義:
    1)命名空間(Namespace)是從名稱到對象的映射,大部分的命名空間都是通過 Python 字典來實現的。
    2)命名空間提供了在項目中避免名字衝突的一種方法。
    3)各個命名空間是獨立的,沒有任何關係的,所以一個命名空間中不能有重名,但不同的命名空間是可以重名而沒有任何影響。
    例如:
        我們舉一個計算機系統中的例子,一個文件夾(目錄)中可以包含多個文件夾,
每個文件夾中不能有相同的文件名,但不同文件夾中的文件可以重名

II)三種命名空間格式:
    一般有三種命名空間:

    內置名稱(built-in names): Python 語言內置的名稱,比如函數名 abs、char 和異常名稱 BaseException、Exception 等等。
    全局名稱(global names):  模塊中定義的名稱,記錄了模塊的變量,包括函數、類、其它導入的模塊、模塊級的變量和常量。
    局部名稱(local names):  函數中定義的名稱,記錄了函數的變量,包括函數的參數和局部定義的變量。(類中定義的也是)

III) 命名空間查找順序
    Python 的查找順序爲:局部的命名空間去 -> 全局命名空間 -> 內置命名空間

    如果找不到變量 a,它將放棄查找並引發一個 NameError 異常

IV) 命名空間的生命週期:
    命名空間的生命週期取決於對象的作用域,如果對象執行完成,則該命名空間的生命週期就結束。

var1 = 5   # var1 是全局名稱
def some_func():
    var2 = 6    # var2 是局部名稱
    def some_inner_func():
        var3 = 7   # var3 是內嵌的局部名稱

 2、作用域

    定義:
           作用域就是一個 Python 程序可以直接訪問命名空間的正文區域
    
    1)在一個 python 程序中,直接訪問一個變量,會從內到外依次訪問所有的作用域直到找到,否則會報未定義的錯誤。
    2)Python 中,程序的變量並不是在哪個位置都可以訪問的,訪問權限決定於這個變量是在哪裏賦值的。
    3)變量的作用域決定了在哪一部分程序可以訪問哪個特定的變量名稱
 
 有四種作用域:
     L(Local):最內層,包含局部變量,比如一個函數/方法內部。
     E(Enclosing):包含了非局部(non-local)也非全局(non-global)的變量。比如兩個嵌套函數,
一個函數(或類) A 裏面又包含了一個函數 B ,那麼對於 B 中的名稱來說 A 中的作用域就爲 nonlocal。
     G(Global):當前腳本的最外層,比如當前模塊的全局變量。
     B(Built-in): 包含了內建的變量/關鍵字等。,最後被搜索
規則順序: L –> E –> G –>B。  

g_count = 0  # 全局作用域
def outer():
    o_count = 1  # 閉包函數外的函數中
    def inner():
        i_count = 2  # 局部作用域

3、全局變量和局部變量

       定義在函數內部的變量擁有一個局部作用域,定義在函數外的擁有全局作用域。
       局部變量只能在其被聲明的函數內部訪問,而全局變量可以在整個程序範圍內訪問。
調用函數時,所有在函數內聲明的變量名稱都將被加入到作用域中

total = 0  # 這是一個全局變量
# 可寫函數說明
def sum(arg1, arg2):
    # 返回2個參數的和."
    total = arg1 + arg2  # total在這裏是局部變量.
    print ("函數內是局部變量 : ", total)
    return total

# 調用sum函數
sum(10, 20)
print ("函數外是全局變量 : ", total)

4、global 和 nonlocal關鍵字

     當內部作用域想修改外部作用域的變量時,就要用到globalnonlocal關鍵字了

     修改全局變量(Global)的時候要用global關鍵字

     修改Enclosing作用域的變量時就要用 nonlocal 關鍵字

#修改全局變量
num = 1     #  全局變量    函數外
def fun1():
    global num  # 需要使用 global 關鍵字聲明
    print('函數內部全局變量修改前:',num)  #修改前
    num = 123
    print('函數內部全局變量修改後:',num)  #修改後
fun1()
print('打印外部的全局變量:',num)

# 如果要修改嵌套作用域(enclosing 作用域,外層非全局作用域)中的變量則需要 nonlocal 關鍵字
def outer():
    number = 10
    def inner():
        nonlocal number   # nonlocal關鍵字聲明   如果不加這句話  number的值無法改變 依舊是10
        number = 100
        print('函數內部Enclosing作用域修改後:',number)
    inner()
    print('外部Enclosing作用域修改後:',number)
#調用函數
outer()

5、給大佬奉茶

   

#!/usr/bin/python3
#1、命名空間
'''
I)定義:
    1)命名空間(Namespace)是從名稱到對象的映射,大部分的命名空間都是通過 Python 字典來實現的。
    2)命名空間提供了在項目中避免名字衝突的一種方法。
    3)各個命名空間是獨立的,沒有任何關係的,所以一個命名空間中不能有重名,但不同的命名空間是可以重名而沒有任何影響。
    例如:
    我們舉一個計算機系統中的例子,一個文件夾(目錄)中可以包含多個文件夾,
每個文件夾中不能有相同的文件名,但不同文件夾中的文件可以重名

II)三種命名空間格式:
    一般有三種命名空間:

    內置名稱(built-in names): Python 語言內置的名稱,比如函數名 abs、char 和異常名稱 BaseException、Exception 等等。
    全局名稱(global names):  模塊中定義的名稱,記錄了模塊的變量,包括函數、類、其它導入的模塊、模塊級的變量和常量。
    局部名稱(local names):  函數中定義的名稱,記錄了函數的變量,包括函數的參數和局部定義的變量。(類中定義的也是)

III) 命名空間查找順序
    Python 的查找順序爲:局部的命名空間去 -> 全局命名空間 -> 內置命名空間

   如果找不到變量 a,它將放棄查找並引發一個 NameError 異常

IV) 命名空間的生命週期:
    命名空間的生命週期取決於對象的作用域,如果對象執行完成,則該命名空間的生命週期就結束。

'''

var1 = 5   # var1 是全局名稱
def some_func():
    var2 = 6    # var2 是局部名稱
    def some_inner_func():
        var3 = 7   # var3 是內嵌的局部名稱

# 2、作用域
print ()
print ('2、作用域')
'''
定義:
    作用域就是一個 Python 程序可以直接訪問命名空間的正文區域
    
    1)在一個 python 程序中,直接訪問一個變量,會從內到外依次訪問所有的作用域直到找到,否則會報未定義的錯誤。
    2)Python 中,程序的變量並不是在哪個位置都可以訪問的,訪問權限決定於這個變量是在哪裏賦值的。
    3)變量的作用域決定了在哪一部分程序可以訪問哪個特定的變量名稱
 
 有四種作用域:
     L(Local):最內層,包含局部變量,比如一個函數/方法內部。
     E(Enclosing):包含了非局部(non-local)也非全局(non-global)的變量。比如兩個嵌套函數,
一個函數(或類) A 裏面又包含了一個函數 B ,那麼對於 B 中的名稱來說 A 中的作用域就爲 nonlocal。
     G(Global):當前腳本的最外層,比如當前模塊的全局變量。
     B(Built-in): 包含了內建的變量/關鍵字等。,最後被搜索
規則順序: L –> E –> G –>B。   
        
'''
g_count = 0  # 全局作用域
def outer():
    o_count = 1  # 閉包函數外的函數中
    def inner():
        i_count = 2  # 局部作用域

#3、全局變量和局部變量
print ()
print ('3、全局變量和局部變量')
'''
    定義在函數內部的變量擁有一個局部作用域,定義在函數外的擁有全局作用域。
    局部變量只能在其被聲明的函數內部訪問,而全局變量可以在整個程序範圍內訪問。
調用函數時,所有在函數內聲明的變量名稱都將被加入到作用域中
'''
total = 0  # 這是一個全局變量
# 可寫函數說明
def sum(arg1, arg2):
    # 返回2個參數的和."
    total = arg1 + arg2  # total在這裏是局部變量.
    print ("函數內是局部變量 : ", total)
    return total

# 調用sum函數
sum(10, 20)
print ("函數外是全局變量 : ", total)


#4、global 和 nonlocal關鍵字
#當內部作用域想修改外部作用域的變量時,就要用到global和nonlocal關鍵字了
#修改全局變量
num = 1     #  全局變量    函數外
def fun1():
    global num  # 需要使用 global 關鍵字聲明
    print('函數內部全局變量修改前:',num)  #修改前
    num = 123
    print('函數內部全局變量修改後:',num)  #修改後
fun1()
print('打印外部的全局變量:',num)

# 如果要修改嵌套作用域(enclosing 作用域,外層非全局作用域)中的變量則需要 nonlocal 關鍵字
def outer():
    number = 10
    def inner():
        nonlocal number   # nonlocal關鍵字聲明   如果不加這句話  number的值無法改變 依舊是10
        number = 100
        print('函數內部Enclosing作用域修改後:',number)
    inner()
    print('外部Enclosing作用域修改後:',number)
#調用函數
outer()

   輸出結果:

   

C:\Users\Administrator\AppData\Local\Programs\Python\Python38-32\python.exe F:/python-space/test/NamespacStudy.py

2、作用域

3、全局變量和局部變量
函數內是局部變量 :  30
函數外是全局變量 :  0
函數內部全局變量修改前: 1
函數內部全局變量修改後: 123
打印外部的全局變量: 123
函數內部Enclosing作用域修改後: 100
外部Enclosing作用域修改後: 100

Process finished with exit code 0

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章