最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python命名空間與作用域深入全面詳解

 更新時(shí)間:2022年11月09日 15:24:12   作者:Python熱愛(ài)者  
命名空間是從名稱到對(duì)象的映射,大部分的命名空間都是通過(guò) Python 字典來(lái)實(shí)現(xiàn)的,作用域就是一個(gè)可以直接訪問(wèn)命名空間的正文區(qū)域。程序的變量并不是在哪個(gè)位置都可以訪問(wèn)的,訪問(wèn)權(quán)限決定于這個(gè)變量是在哪里賦值的

1.命名空間

先看看官方文檔的一段話:

命名空間(Namespace)是從名稱到對(duì)象的映射,大部分的命名空間都是通過(guò) Python 字典來(lái)實(shí)現(xiàn)的。

命名空間提供了在項(xiàng)目中避免名字沖突的一種方法。各個(gè)命名空間是獨(dú)立的,沒(méi)有任何關(guān)系的,所以一個(gè)命名空間中不能有重名,但不同的命名空間是可以重名而沒(méi)有任何影響。

我們舉一個(gè)計(jì)算機(jī)系統(tǒng)中的例子,一個(gè)文件夾(目錄)中可以包含多個(gè)文件夾,每個(gè)文件夾中不能有相同的文件名,但不同文件夾中的文件可以重名。

一般有三種命名空間:

  1. 內(nèi)置名稱(built-in names), Python 語(yǔ)言內(nèi)置的名稱,比如函數(shù)名 abs、char 和異常名稱 BaseException、Exception 等等。
  2. 全局名稱(global names),模塊中定義的名稱,記錄了模塊的變量,包括函數(shù)、類、其它導(dǎo)入的模塊、模塊級(jí)的變量和常量。
  3. 局部名稱(local names),函數(shù)中定義的名稱,記錄了函數(shù)的變量,包括函數(shù)的參數(shù)和局部定義的變量。(類中定義的也是)

命名空間查找順序:

假設(shè)我們要使用變量 lizexiong,則 Python 的查找順序?yàn)椋壕植康拿臻g去 -> 全局命名空間 -> 內(nèi)置命名空間。

如果找不到變量 lizexiong,它將放棄查找并引發(fā)一個(gè) NameError 異常:

NameError: name 'lizexiong' is not defined。

命名空間的生命周期:

命名空間的生命周期取決于對(duì)象的作用域,如果對(duì)象執(zhí)行完成,則該命名空間的生命周期就結(jié)束。

因此,我們無(wú)法從外部命名空間訪問(wèn)內(nèi)部命名空間的對(duì)象。

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

如下圖所示,相同的對(duì)象名稱可以存在于多個(gè)命名空間中。

2.作用域

作用域就是一個(gè) Python 程序可以直接訪問(wèn)命名空間的正文區(qū)域。

在一個(gè) python 程序中,直接訪問(wèn)一個(gè)變量,會(huì)從內(nèi)到外依次訪問(wèn)所有的作用域直到找到,否則會(huì)報(bào)未定義的錯(cuò)誤。

Python 中,程序的變量并不是在哪個(gè)位置都可以訪問(wèn)的,訪問(wèn)權(quán)限決定于這個(gè)變量是在哪里賦值的。

變量的作用域決定了在哪一部分程序可以訪問(wèn)哪個(gè)特定的變量名稱。Python 的作用域一共有4種,分別是:

有四種作用域:

  • L(Local):最內(nèi)層,包含局部變量,比如一個(gè)函數(shù)/方法內(nèi)部。
  • E(Enclosing):包含了非局部(non-local)也非全局(non-global)的變量。比如兩個(gè)嵌套函數(shù),一個(gè)函數(shù)(或類) A 里面又包含了一個(gè)函數(shù) B ,那么對(duì)于 B 中的名稱來(lái)說(shuō) A 中的作用域就為 nonlocal。
  • G(Global):當(dāng)前腳本的最外層,比如當(dāng)前模塊的全局變量。
  • B(Built-in): 包含了內(nèi)建的變量/關(guān)鍵字等,最后被搜索。

規(guī)則順序: L –> E –> G –> B。

在局部找不到,便會(huì)去局部外的局部找(例如閉包),再找不到就會(huì)去全局找,再者去內(nèi)置中找。

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

內(nèi)置作用域是通過(guò)一個(gè)名為 builtin 的標(biāo)準(zhǔn)模塊來(lái)實(shí)現(xiàn)的,但是這個(gè)變量名自身并沒(méi)有放入內(nèi)置作用域內(nèi),所以必須導(dǎo)入這個(gè)文件才能夠使用它。在Python3.0中,可以使用以下的代碼來(lái)查看到底預(yù)定義了哪些變量:

>>> import builtins
>>> dir(builtins)

Python 中只有模塊(module),類(class)以及函數(shù)(def、lambda)才會(huì)引入新的作用域,其它的代碼塊(如 if/elif/else/、try/except、for/while等)是不會(huì)引入新的作用域的,也就是說(shuō)這些語(yǔ)句內(nèi)定義的變量,外部也可以訪問(wèn),如下代碼:

>>> if True:
...  msg = 'I am from Lizexiong'
... 
>>> msg
'I am from Lizexiong'
>>>

實(shí)例中 msg 變量定義在 if 語(yǔ)句塊中,但外部還是可以訪問(wèn)的。

如果將 msg 定義在函數(shù)中,則它就是局部變量,外部不能訪問(wèn):

>>> def test():
...     msg_inner = 'I am from Lizexiong'
... 
>>> msg_inner
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'msg_inner' is not defined
>>>

從報(bào)錯(cuò)的信息上看,說(shuō)明了 msg_inner 未定義,無(wú)法使用,因?yàn)樗蔷植孔兞?,只有在函?shù)內(nèi)可以使用。

全局變量和局部變量

定義在函數(shù)內(nèi)部的變量擁有一個(gè)局部作用域,定義在函數(shù)外的擁有全局作用域。

局部變量只能在其被聲明的函數(shù)內(nèi)部訪問(wèn),而全局變量可以在整個(gè)程序范圍內(nèi)訪問(wèn)。調(diào)用函數(shù)時(shí),所有在函數(shù)內(nèi)聲明的變量名稱都將被加入到作用域中。

如下實(shí)例:

total = 0 # 這是一個(gè)全局變量
# 可寫函數(shù)說(shuō)明
def sum( arg1, arg2 ):
    #返回2個(gè)參數(shù)的和."
    total = arg1 + arg2 # total在這里是局部變量.
    print ("函數(shù)內(nèi)是局部變量 : ", total)
    return total
#調(diào)用sum函數(shù)
sum( 10, 20 )
print ("函數(shù)外是全局變量 : ", total)

以上實(shí)例輸出結(jié)果:
函數(shù)內(nèi)是局部變量 :  30
函數(shù)外是全局變量 :  0

global 和 nonlocal關(guān)鍵字

當(dāng)內(nèi)部作用域想修改外部作用域的變量時(shí),就要用到 global 和 nonlocal 關(guān)鍵字了。

以下實(shí)例修改全局變量 num:

num = 1
def fun1():
    global num  # 需要使用 global 關(guān)鍵字聲明
    print(num) 
    num = 123
    print(num)
fun1()
print(num)

以上實(shí)例輸出結(jié)果:
1
123
123

如果要修改嵌套作用域(enclosing 作用域,外層非全局作用域)中的變量則需要 nonlocal 關(guān)鍵字了,如下實(shí)例:

def outer():
    num = 10
    def inner():
        nonlocal num   # nonlocal關(guān)鍵字聲明
        num = 100
        print(num)
    inner()
    print(num)
outer()

以上實(shí)例輸出結(jié)果:

100
100

另外有一種特殊情況,假設(shè)下面這段代碼被運(yùn)行:

'''
學(xué)習(xí)中遇到問(wèn)題沒(méi)人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流群:711312441
尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書!
''' 
a = 10
def test():
    a = a + 1
    print(a)
test()
以上程序執(zhí)行,報(bào)錯(cuò)信息如下:
Traceback (most recent call last):
  File "test.py", line 7, in <module>
    test()
  File "test.py", line 5, in test
    a = a + 1
UnboundLocalError: local variable 'a' referenced before assignment

錯(cuò)誤信息為局部作用域引用錯(cuò)誤,因?yàn)?test 函數(shù)中的 a 使用的是局部,未定義,無(wú)法修改。

修改 a 為全局變量:

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

執(zhí)行輸出結(jié)果為:
11

也可以通過(guò)函數(shù)參數(shù)傳遞:

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

執(zhí)行輸出結(jié)果為:
11

到此這篇關(guān)于Python命名空間與作用域深入全面詳解的文章就介紹到這了,更多相關(guān)Python命名空間與作用域內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python基礎(chǔ)中的列表你了解嗎

    Python基礎(chǔ)中的列表你了解嗎

    這篇文章主要為大家介紹了Python基礎(chǔ)中的列表列表,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • pytorch 修改預(yù)訓(xùn)練model實(shí)例

    pytorch 修改預(yù)訓(xùn)練model實(shí)例

    今天小編就為大家分享一篇pytorch 修改預(yù)訓(xùn)練model實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-01-01
  • 個(gè)人微信公眾號(hào)接入ChatGPT的教程分享

    個(gè)人微信公眾號(hào)接入ChatGPT的教程分享

    這篇文章主要為大家詳細(xì)介紹了如何為個(gè)人微信公眾號(hào)接入ChatGPT,文中的實(shí)現(xiàn)步驟講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下
    2023-05-05
  • 淺談Python爬蟲(chóng)基本套路

    淺談Python爬蟲(chóng)基本套路

    這篇文章主要介紹了Python爬蟲(chóng)基本套路,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Python識(shí)別二維碼的兩種方法詳解

    Python識(shí)別二維碼的兩種方法詳解

    在學(xué)習(xí)Python處理二維碼的過(guò)程中,我們看到的大多是“用python生成酷炫二維碼”、“用Python制作動(dòng)圖二維碼”之類的文章。而關(guān)于使用Python批量識(shí)別二維碼的教程,并不多見(jiàn)。本文就為大家總結(jié)了Python識(shí)別二維碼的兩種方法,感興趣的可以學(xué)習(xí)一下
    2022-06-06
  • Win7 64位下python3.6.5安裝配置圖文教程

    Win7 64位下python3.6.5安裝配置圖文教程

    這篇文章主要為大家詳細(xì)介紹了Win7 64位下python3.6.5安裝配置的圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • 使用Python中的PIL庫(kù)給圖片添加馬賽克

    使用Python中的PIL庫(kù)給圖片添加馬賽克

    Pillow是一個(gè)Python圖像處理庫(kù),提供了廣泛的圖像處理功能包括圖像格式轉(zhuǎn)換、圖像增強(qiáng)等,本文就來(lái)用PIL庫(kù)實(shí)現(xiàn)給圖片添加馬賽克效果,感興趣的可以了解一下
    2023-05-05
  • 淺談pytorch中torch.max和F.softmax函數(shù)的維度解釋

    淺談pytorch中torch.max和F.softmax函數(shù)的維度解釋

    這篇文章主要介紹了淺談pytorch中torch.max和F.softmax函數(shù)的維度解釋,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-06-06
  • 使用pandas中的DataFrame數(shù)據(jù)繪制柱狀圖的方法

    使用pandas中的DataFrame數(shù)據(jù)繪制柱狀圖的方法

    下面小編就為大家分享一篇使用pandas中的DataFrame數(shù)據(jù)繪制柱狀圖的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • Appium自動(dòng)化測(cè)試實(shí)現(xiàn)H5頁(yè)面元素定位

    Appium自動(dòng)化測(cè)試實(shí)現(xiàn)H5頁(yè)面元素定位

    本文主要介紹了Appium自動(dòng)化測(cè)試實(shí)現(xiàn)H5頁(yè)面元素定位,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02

最新評(píng)論

绥中县| 香格里拉县| 西乌珠穆沁旗| 卢氏县| 静宁县| 伊春市| 绍兴市| 恩施市| 霍山县| 密山市| 瑞昌市| 朝阳市| 河曲县| 和林格尔县| 苏尼特左旗| 普兰县| 邹平县| 湛江市| 响水县| 乌兰察布市| 泽州县| 安陆市| 汨罗市| 屯留县| 商水县| 昌平区| 临沭县| 肇东市| 自治县| 平乡县| 平舆县| 仲巴县| 营口市| 凌云县| 金昌市| 洪洞县| 开封县| 乌拉特前旗| 六盘水市| 鄂托克前旗| 百色市|