国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

python基礎教程:作用域和命名空間

wangzy2019 / 1809人閱讀

摘要:正如我們前面舉的張三的例子那樣,不同命名空間中的名稱之間沒有任何關系。作用域作用域,是一個命名空間可直接發放完的代碼的文本區域。刪除也是如此,語句會從局部命名空間的引用中移除對的綁定。

命名空間和作用域的概念我們之前也提到過,比如內置函數globals(),函數中變量的作用域,模塊使用的import等等。這些可能讓我們對這兩個概念有了大致的理解。本節再詳細探討一下。

Python命名空間

命名空間,就是一個從名稱到對象的映射關系。

對于這個概念的理解,我們打個比方:河西村有個人(對象)叫張三(名稱),河東村有個人(對象)也叫張三(名稱),倆人雖然都叫張三(名稱),但是他們倆不是同一個人(對象),因為他們屬于不同的村(命名空間)。有一天,河西村的張三名聲大了,傳播到鎮上了(名稱被import到“鎮”這個空間),鎮上的人講起“張三”時,就是說的河西村的,要是說河東村的張三,就要特別說“河東村的張三”(河東村.張三)。這就是命名空間的意思——映射了名稱到對象的名稱范圍。

目前,大部分的命名空間都是由Python的字典實現的,通常我們不會去關注它們,處理要面對性能問題時,并且這種實現可能在將來改變。所以說,我們不需要深究命名空間的內部實現,但要搞明白它的使用。

下面是幾個命名空間的例子:

內置函數的集合(包含print()等內置函數和內置異常等);

模塊中的全局名稱;

函數調用中的本地名稱。

另外,從某種含義上說,對象的屬性集合也是一種命名空間的形式。正如我們前面舉的張三的例子那樣,不同命名空間中的名稱之間沒有任何關系。比如,兩個不同模塊都可以定義函數max()而不會產生混淆,模塊的用戶要調用某個max()函數就要在其前面加上模塊名稱。(詳見import的使用)

Python屬性

我們把任何跟在一個點號之后的名稱都稱為屬性。例如,在表達式a.name中,real是對象a的一個屬性。同樣對模塊中函數的引用也是屬性引用,在表達式modname.funcname中,modname是一個模塊對象,而funcname是它的一個屬性。

屬性可以是只讀的也可以是可寫的。如果是可寫的,那么我們就可以對屬性進行賦值,比如,modname.name = "猿人學Python"。可寫的屬性同樣可以用del語句刪除,比如del modname.name將把modname對象的name屬性移除。

不同時刻創建的命名空間有不同的生存期:

包含內置名稱的命名空間是在Python解釋器啟動時創建的,永遠不會被刪除(除非退出解釋器);

模塊的全局命名空間在模塊定義被讀入(import)時創建,通常,模塊命名空間也會持續到解釋器退出;

從腳本文件(.py.pyc)讀取或交互式(解釋器shell)讀取而被解釋器的頂層調用執行的語句,被認為是__main__模塊調用的一部分,它們有自己的全局命名空間;

函數的本地命名空間創建于該函數被調用的時刻,并且在函數返回或拋出一個不在函數內部處理的異常時被刪除。遞歸函數的每次遞歸調用都會創建它自己的本地命名空間;

內置名稱實際上也存在于一個模塊中,它叫做builtins

Python作用域

作用域,是一個命名空間可直接發放完的Python代碼的文本區域。這里的“可直接訪問”的意思是,對名稱的不加點號(非限定性)引用會嘗試在命名空間中查找該名稱。

盡管作用域是靜態確定的,但它們是動態使用的。在執行期間的任何時刻,至少有三個嵌套的作用域,它們的命名空間可以直接訪問:

最內部作用域:最先搜索該作用域,包含局部名稱

封閉函數作用域:從最近的封閉作用域開始搜索,包含非局部名稱,也包括非全局名稱

倒數第二個作用域:包含當前模塊的全局名稱

最外面的作用域:最后搜索,是包含內置名稱的命名空間

如果一個名稱被聲明為全局變量,則所有引用和賦值將直接指向包含該模塊的全局名稱的中間作用域。 要重新綁定在最內層作用域以外找到的變量,可以使用nonlocal語句聲明為非本地變量。 如果沒有被聲明為非本地變量,這些變量將是只讀的(嘗試寫入這樣的變量只會在最內層作用域中創建一個新的局部變量,而同名的外部變量保持不變)。

很重要的一點:作用域是按文本方式確定的,模塊內定義的函數的全局作用域就是該模塊的命名空間,無論該函數從什么地方或以什么別名被調用。另一方面,實際的名稱搜索是在運行時動態完成的。

Python 的一個特殊之處在于: 如果不存在生效的global語句,對名稱的賦值總是進入最內層作用域。 賦值不會復制數據,它們只是將名稱綁定到對象。刪除也是如此,語句del x會從局部命名空間的引用中移除對x的綁定。事實上,所有引入新名稱的操作都使用局部作用域,特別是import語句和函數定義會在局部作用域中綁定模塊或函數名稱。

global語句可被用來表明特定變量生存于全局作用域并且應當在其中被重新綁定;nonlocal語句表明特定變量生存于外層作用域中并且應當在其中被重新綁定。

下面我們來看一個作用域和命名空間的例子,它演示流量如何引用不同作用域和命名空間以及globalnonlocal如何影響變量綁定:

def scope_demo():
    def do_local():
        name = "local name"

    def do_nonlocal():
        nonlocal name
        name = "nonlocal name"

    def do_global():
        global name
        name = "global name"

    name = "demo name"
    do_local()
    print("After local assignment:", name)
    do_nonlocal()
    print("After nonlocal assignment:", name)
    do_global()
    print("After global assignment:", name)

scope_demo()
print("In global scope:", name)

思考一下,上面的代碼會輸出怎樣的結果?如果你對上面的講解理解透了,你的思考結果應該是這樣的:

After local assignment: demo name
After nonlocal assignment: nonlocal name
After global assignment: nonlocal name
In global scope: global name

這里要說明的是,do_global()函數修改了全局變量name,并沒有對scope_demo()函數的局部變量name做修改,所以打印了After global assignment: nonlocal name

局部賦值(默認情況)不會改變scope_demoname的綁定;nonlocal賦值會改變函數scope_demoname的綁定,而global賦值會改變模塊層級的綁定(不是scope_demo內部的name,而是其之外的全局作用域下的name)。

命令空間和作用域總結:

命名空間定義了一個名稱的范圍,作用域指定了能看到命名空間的文本區域(代碼)。代碼執行時,名稱搜索的順序和范圍如下:

最內部作用域:最先搜索該作用域,包含局部名稱

封閉函數作用域:從最近的封閉作用域開始搜索,包含非局部名稱,也包括非全局名稱

倒數第二個作用域:包含當前模塊的全局名稱

最外面的作用域:最后搜索,是包含內置名稱的命名空間

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43845.html

相關文章

  • Python基礎教程

    摘要:函數內的變量被稱為局部變量,這是與全局變量相反的概念。有一些進行函數式編程的機制。繼承以通用的類為基礎建立專門的類對象。 6.4.5 參數收集的逆過程 假設有如下函數: def add(x,y): return x+y 比如說有個包含由兩個相加的數字組成的元組: params = (1,2) 使用*運算符對參數進行分配,不過是在調用而不是在定義時使用: >>> add(*params)...

    daydream 評論0 收藏0
  • python基礎教程:類

    摘要:類對象被創建時存在于類命名空間內的所有名稱都是有效的屬性名稱。類的實例化,是使用函數表示法,可以把類對象看做是會返回一個新的類實例的函數。這就是可變對象作為類變量時的特性。類變量是所有類的實例共享的屬性和方法,實例變量是每個實例獨有的數據。 Python是面向對象的高級編程語言,在Python里面一切都是對象:數字、字符串、元組、列表、字典、集合等內置數據類型,以及函數、方法、類、模塊...

    fish 評論0 收藏0
  • 一道題看Python的LEGB規則

    摘要:例題核心編程第二版變量作用域和命名空間一節有以下一道題目請問輸出結果是什么要想解這道題,必須先了解中的一些概念的變量名解析機制有時稱為。 例題 《核心編程(第二版)》變量作用域和命名空間一節有以下一道題目 # coding=utf-8 #!/usr/bin/env python def proc1(): j,k = 3,4 print j == %d and k ==...

    iamyoung001 評論0 收藏0
  • Python學習--最完整的基礎知識大全

    摘要:迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。迭代器有兩個基本的方法和。調用一個生成器函數,返回的是一個迭代器對象。生成器函數生成器函數返回一個迭代器函數函數傳入不定長參數加了星號的變量名會存放所有未命名的變量參數。 Python學習--最完整的基礎知識大全 關于python的基礎知識學習,網上有很多資料,今天我就把我收藏的整理一下分享給大家! 菜鳥教程pytho...

    王笑朝 評論0 收藏0
  • Python基礎教程》第六章--讀書筆記

    摘要:第六章抽象本章會介紹如何將語句組織成函數。關鍵字參數和默認值目前為止,我們使用的參數都是位置參數,因為它們的位置很重要,事實上比它們的名字更重要。參數前的星號將所有值放置在同一個元祖中。函數內的變量被稱為局部變量。 第六章:抽象 本章會介紹如何將語句組織成函數。還會詳細介紹參數(parameter)和作用域(scope)的概念,以及遞歸的概念及其在程序中的用途。 懶惰即美德 斐波那契數...

    AnthonyHan 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<