0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

python變量的作用域

python爬蟲知識分享 ? 來源:python爬蟲知識分享 ? 作者:python爬蟲知識分享 ? 2022-03-03 16:50 ? 次閱讀

python變量的作用域

1. 作用域

Python的作用域可以分為四種:

L (Local) 局部作用域

E (Enclosing) 閉包函數(shù)外的函數(shù)中

G (Global) 全局作用域

B (Built-in) 內建作用域

變量/函數(shù) 的查找順序: L –> E –> G –>B

意思是,在局部找不到的,便去局部外的局部作用域找(例如 閉包),再找不到的就去全局作業(yè)域里找,再找不到就去內建作業(yè)域中找。

會影響 變量/函數(shù) 作用范圍的有

函數(shù):def 或 lambda

類:class

關鍵字:global noglobal

文件:*py

推導式:[],{},()等,僅限Py3.x中,Py2.x會出現(xiàn)變量泄露。

1、賦值在前,引用在后

# ------同作用域內------
name = "MING"
print(name)

# ------不同作用域內------
name = "MING"
def main():
    print(name)

2、引用在前,賦值在后(同一作用域內)

print(name)
name = "MING"

# UnboundLocalError: local variable 'name' referenced before assignment

3、賦值在低層,引用在高層

# L -> E -> G -> B
# 從左到右,由低層到高層
def main():
    name = "MING"

print(name)
# NameError: name 'name' is not defined

2. 閉包

閉包這個概念很重要噢。你一定要掌握。

在一個外函數(shù)中定義了一個內函數(shù),內函數(shù)里運用了外函數(shù)的臨時變量,并且外函數(shù)的返回值是內函數(shù)的引用。這樣就構成了一個閉包。其實裝飾函數(shù),很多都是閉包。

好像并不難理解,為什么初學者會覺得閉包難以理解呢?

我解釋一下,你就明白了。

一般情況下,在我們認知當中,如果一個函數(shù)結束,函數(shù)的內部所有東西都會釋放掉,還給內存,局部變量都會消失。但是閉包是一種特殊情況,如果外函數(shù)在結束的時候發(fā)現(xiàn)有自己的臨時變量將來會在內部函數(shù)中用到,就把這個臨時變量綁定給了內部函數(shù),然后自己再結束。

你可以看下面這段代碼,就構成了閉包。在內函數(shù)里可以引用外函數(shù)的變量。

def deco():
    name = "MING"
    def wrapper():
        print(name)
    return wrapper

deco()()
# 輸出:MING

3. 改變作用域

變量的作用域,與其定義(或賦值)的位置有關,但不是絕對相關。 因為我們可以在某種程度上去改變向上的作用范圍。

關鍵字:global 將 局部變量 變?yōu)槿肿兞?/p>

關鍵字:nonlocal 可以在閉包函數(shù)中,引用并使用閉包外部函數(shù)的變量(非全局的噢)

global好理解,這里只講下nonlocal。

先來看個例子

def deco():
    age = 10
    def wrapper():
        age += 1
    return wrapper

deco()()

運行一下,會報錯。

# UnboundLocalError: local variable 'age' referenced before assignment

但是這樣就OK

def deco():
    age = 10
    def wrapper():
        nonlocal age
        age += 1
    return wrapper

deco()()
# 輸出:11

其實,你如果不使用 +=-=等一類的操作,不加nonlocal也沒有關系。這就展示了閉包的特性。

def deco():
    age = 10
    def wrapper():
        print(age)
    return wrapper

deco()()
# 輸出:10

4. 變量集合

在Python中,有兩個內建函數(shù),你可能用不到,但是需要掌握它們。

globals() :以dict的方式存儲所有全局變量

locals():以dict的方式存儲所有局部變量

globals()

def foo():
    print("I am a func")

def bar():
    foo="I am a string"
    foo_dup = globals().get("foo")
    foo_dup()

bar()
# 輸出
# I am a func

locals()

other = "test"

def foobar():
    name = "MING"
    gender = "male"
    for key,value in locals().items():
        print(key, "=", value)

foobar()
# 輸出
# name = MING
# gender = male

審核編輯:符乾江
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • python
    +關注

    關注

    55

    文章

    4767

    瀏覽量

    84375
  • 作用域
    +關注

    關注

    0

    文章

    6

    瀏覽量

    6099
收藏 人收藏

    評論

    相關推薦

    CAN數(shù)據(jù)幀的各個及其作用

    CAN數(shù)據(jù)幀由多個組成,包括幀起始、仲裁、控制、數(shù)據(jù)和幀結束。每個都有其特定的作用,
    的頭像 發(fā)表于 07-24 15:10 ?796次閱讀

    Win10 vscode中無法編譯,提示python.exe: command not found怎么解決?

    電腦中已經(jīng)刪除之前安裝的python,環(huán)境變量也添加了報錯內容中要求的python路徑,我用git bash、cmd也是可以打開python的,證明環(huán)境
    發(fā)表于 06-07 06:42

    python環(huán)境變量的配置pip

    Python環(huán)境變量的配置和使用是每個Python開發(fā)者都需要了解和掌握的基本技能之一。在本文中,我們將詳細介紹如何正確配置Python環(huán)境變量
    的頭像 發(fā)表于 12-15 15:41 ?2328次閱讀

    如何在嵌入式C編碼中規(guī)范變量

    防止外部文件的非正常訪問。直接使用其他模塊的私有數(shù)據(jù),將使模塊間的關系逐漸走向“剪不斷理還亂”的耦合狀態(tài),這種情形是不允許的。 ◎ 避免局部變量與全局變量同名。 說明:盡管局部變量和全局變量
    的頭像 發(fā)表于 12-07 14:42 ?319次閱讀

    python中如何交換兩個數(shù)的值相加

    Python是一種簡單易學的高級語言,其交換兩個數(shù)的值相加是一種常見的操作。交換變量的值可以在許多情況下發(fā)揮作用,如算法、排序、邏輯控制等。本文將詳細介紹Python中實現(xiàn)交換兩個數(shù)的
    的頭像 發(fā)表于 11-29 17:29 ?603次閱讀

    pycharm怎么配置python環(huán)境變量

    正確的 Python 環(huán)境變量是非常重要的,因為它會影響到項目的運行和依賴包的安裝。本文將詳細介紹如何在 PyCharm 中配置 Python 環(huán)境變量。 PyCharm 支持在全局和
    的頭像 發(fā)表于 11-29 14:56 ?2682次閱讀

    淺談符號IO和圖形IO

    符號IO組態(tài) 方法:把“符號IO”這個灰色塊狀拖拽到指定畫面位置,鼠標右鍵彈出對話框“屬性”后點擊“常規(guī)”找到過程“變量”后,連接變量。添加文本并創(chuàng)建文本名稱。
    的頭像 發(fā)表于 11-29 09:33 ?1624次閱讀
    淺談符號IO<b class='flag-5'>域</b>和圖形IO<b class='flag-5'>域</b>

    python軟件怎么運行代碼

    理解的機器代碼。 在本文中,我們將詳細介紹如何運行Python代碼。我們將探討以下幾個方面:安裝Python,設置環(huán)境變量,選擇一個集成開發(fā)環(huán)境(IDE)或文本編輯器,編寫代碼,運行代碼和調試代碼。 第一步是安裝
    的頭像 發(fā)表于 11-28 16:02 ?842次閱讀

    安裝python怎么添加到環(huán)境變量

    Python是一種簡單易學的腳本語言,廣泛應用于開發(fā)各種類型的應用程序。為了在Windows操作系統(tǒng)上使用Python的命令行工具,需要將Python添加到系統(tǒng)的環(huán)境變量中。本文將向您
    的頭像 發(fā)表于 11-23 16:40 ?2932次閱讀

    python變量命名規(guī)則

    Python是一種高級編程語言,廣泛應用于軟件開發(fā)、數(shù)據(jù)分析和科學計算等領域。在Python中,變量是用來存儲數(shù)據(jù)的容器,它們具有名稱以及與之關聯(lián)的值。然而,變量的命名并不是隨意的,而
    的頭像 發(fā)表于 11-23 15:44 ?1162次閱讀

    python用input賦值多個變量

    Python中,可以使用 input 函數(shù)從用戶那里獲取輸入,并將輸入賦值給變量。當用戶輸入多個值時,可以使用空格、逗號或其他分隔符將它們分開。下面將詳細介紹如何使用 input 函數(shù)賦值多個變量
    的頭像 發(fā)表于 11-23 15:37 ?3051次閱讀

    python循環(huán)創(chuàng)建變量并賦值

    循環(huán)是Python編程中非常重要的一個概念,它可以讓我們輕松地重復執(zhí)行某些代碼塊,從而簡化編程過程并提高代碼的效率。在循環(huán)中,我們經(jīng)常需要創(chuàng)建變量并賦值,這是非常常見的操作。接下來,我將詳盡地解釋在
    的頭像 發(fā)表于 11-23 14:51 ?1573次閱讀

    for循環(huán)里的變量是局部變量

    作用是重復執(zhí)行一段代碼,循環(huán)變量則是在每次迭代中改變其值,以便控制循環(huán)的次數(shù)或迭代的范圍。循環(huán)變量作用通常被限制在循環(huán)的花括號內部,這
    的頭像 發(fā)表于 11-23 14:50 ?2434次閱讀

    python如何導入模塊

    Python是一種強大的編程語言,它支持模塊化編程,使得開發(fā)者可以將代碼分解為可重用且獨立的模塊。模塊是一個包含函數(shù)、類和變量等定義的文件,我們可以使用import語句將這些模塊導入到我們的程序中
    的頭像 發(fā)表于 11-22 14:46 ?875次閱讀

    Python中互換X和Y的值

    Python中,我們可以通過使用一個中間變量來互換X和Y的值。具體的步驟如下: 步驟一:定義X和Y的值 首先,我們需要定義X和Y的初始值。我們可以使用Python中的賦值語句來給X和Y賦初值。例如
    的頭像 發(fā)表于 11-22 11:00 ?2319次閱讀