成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

Python 的命名空間

ralap / 1657人閱讀

摘要:真正管理這些名子的事物就是本文的主角命名空間。閉包命名空間閉包函數(shù)的名稱(chēng)空間引入。函數(shù)調(diào)用時(shí)產(chǎn)生新的局部命名空間函數(shù)返回結(jié)果拋出異常時(shí)釋放命名空間,每一次遞歸都生成一個(gè)命名空間。標(biāo)識(shí)符產(chǎn)生地點(diǎn)決定標(biāo)識(shí)符所處的命名空間。

懶得掃全文的童鞋,可以直接跳到最后看總結(jié)。
我們先從一個(gè)簡(jiǎn)單的栗子說(shuō)起:

栗子

a 文件中有變量 va 以及類(lèi) A,b 文件導(dǎo)入 aclass A ,并打印出 A

#a.py
va = ["dobi", "a", "dog"]

print("a1", id(va))

class A():
    def __init__(self):
        pass

    def rtn(self):
        global va
        va.insert(1,"is")
        print("a3", id(va))
        return va

print("a2", va)


#b.py
from a import A

print("b", A)

執(zhí)行 b 文件的結(jié)果為:

Reloaded modules: a
a1 2407907960200
a2 ["dobi", "a", "dog"]
b 

可以發(fā)現(xiàn),雖然 b 只是導(dǎo)入了 a 中的 class A,但導(dǎo)入這個(gè)過(guò)程卻執(zhí)行了整個(gè) a 文件,那么我們是否能夠在 b 中訪問(wèn) a 中的全局變量 va 呢:

print(va)
# NameError: name "va" is not defined
print(a.va)
# NameError: name "a" is not defined
print(b.va)
# NameError: name "b" is not defined

嘗試了各類(lèi)調(diào)用方法,發(fā)現(xiàn)都無(wú)法正常訪問(wèn) a 的全局變量 va,既然 b 的導(dǎo)入執(zhí)行了整個(gè) a 文件,甚至還打印出了 vaid 和值,又為什么無(wú)法在 b 中調(diào)用 va 呢?

這個(gè)問(wèn)題所涉及到的內(nèi)容就是:命名空間。

但在開(kāi)始正題之前,我們需要闡明若干概念:

一些基本概念的澄清 對(duì)象

Python 一切皆對(duì)象,每個(gè)對(duì)象都具有 一個(gè)ID、一個(gè)類(lèi)型、一個(gè)值;對(duì)象一旦建立,ID 便不會(huì)改變,可以直觀的認(rèn)為 ID 就是對(duì)象在內(nèi)存中的地址

a = [1, 2]
b = a
id(a)
# 2407907978632
id(b)
# 2407907978632
b[1] = 3
a
# [1, 3]

上例 a, b 共享了同一個(gè) ID、同一個(gè)值、同一個(gè)類(lèi)型。因此 a, b 表達(dá)的是同一個(gè)對(duì)象,但 a, b 又明顯是不同的,比如一個(gè)叫 "a" 一個(gè)叫 "b"...既然是同一個(gè)對(duì)象,為什么又有不同的名字呢?難道名字不是對(duì)象的屬性?

標(biāo)識(shí)符

事實(shí)確實(shí)如此,這是 Python 比較特殊一點(diǎn):如同"a" "b" 這樣的名稱(chēng)其實(shí)有一個(gè)共同的名字:identifier(注意不要與 ID 混淆了),中文名為“標(biāo)識(shí)符”,來(lái)解釋一下:

標(biāo)識(shí)符:各類(lèi)對(duì)象的名稱(chēng),比如函數(shù)名、方法名、類(lèi)名,變量名、常量名等。

在 Python 中賦值并不會(huì)直接復(fù)制數(shù)據(jù),而只是將名稱(chēng)綁定到對(duì)象,對(duì)象本身是不知道也不需要關(guān)心(該關(guān)心這個(gè)的是程序猿)自己叫什么名字的。一個(gè)對(duì)象甚至可以指向不同的標(biāo)識(shí)符,上例中的"a" "b"便是如此。真正管理這些名子的事物就是本文的主角“命名空間”。

命名空間

命名空間(Namespace):名字(標(biāo)識(shí)符)到對(duì)象的映射。

簡(jiǎn)而言之,命名空間可以理解為:記錄對(duì)象和對(duì)象名字對(duì)應(yīng)關(guān)系的空間;現(xiàn)今 Python 的大部分命名空間是通過(guò)字典來(lái)實(shí)現(xiàn)的,也即一個(gè)命名空間就是名字到對(duì)象的映射,標(biāo)識(shí)符是鍵,對(duì)象則是值。

作用域

與命名空間相對(duì)的一個(gè)概念就是“作用域”,那么什么又是作用域呢?

作用域(Scope):本質(zhì)是一塊文本區(qū)域,Python 通過(guò)該文本區(qū)域可以直接訪問(wèn)相應(yīng)的命名空間。

這里需要搞清楚什么是直接訪問(wèn):

#x.py
a = 1
class A():
    def func():pass
python x.py
a   #直接訪問(wèn)
# 1
A.func  #屬性訪問(wèn)

Python 中不加 . 的訪問(wèn)為直接訪問(wèn),反之為屬性訪問(wèn)。

因此可以簡(jiǎn)單的將作用域理解為“直接訪問(wèn)命名空間的一種實(shí)現(xiàn)”,具體而言:

作用域內(nèi)相應(yīng)的命名空間可以被直接訪問(wèn);

只有作用域內(nèi)的命名空間才可以被直接訪問(wèn)(因此并不是所有的命名空間都可以被直接訪問(wèn))。

看不懂? 沒(méi)關(guān)系,后面會(huì)解釋?zhuān)F(xiàn)在先回到命名空間這個(gè)話(huà)題上,我們經(jīng)常接觸的命名空間有四類(lèi):

LEGB LEGB 命名空間

這四類(lèi)命名空間可以簡(jiǎn)記為 LEGB:

局部命名空間(local):指的是一個(gè)函數(shù)或者一個(gè)類(lèi)所定義的名稱(chēng)空間;包括函數(shù)的參數(shù)、局部變量、類(lèi)的屬性等。

閉包命名空間(enclosing function):閉包函數(shù) 的名稱(chēng)空間(Python 3 引入)。

全局命名空間(global):讀入一個(gè)模塊(也即一個(gè).py文檔)后產(chǎn)生的名稱(chēng)空間。

內(nèi)建命名空間(builtin):Python 解釋器啟動(dòng)時(shí)自動(dòng)載入__built__模塊后所形成的名稱(chēng)空間;諸如 str/list/dict...等內(nèi)置對(duì)象的名稱(chēng)就處于這里。

為了說(shuō)清楚這幾類(lèi)命名空間,舉個(gè)栗子:

#c.py
v1 = "a global var"

def func(v):
    v2 = "a local var"
    def inn_func():
        v3 = v2 + v
        return v3
    return inn_func

內(nèi)建命名空間比較好理解,我們重點(diǎn)講解下其他三個(gè):

"v1" 為全局變量 v1 的名子,其所處的命名空間為全局命名空間;需要注意的是全局命名空間包括 "func" 但不包括 func 的參數(shù)和內(nèi)部變量。

func 囊括 "v"、"v2""inn_func" 名稱(chēng)的空間為局部命名空間;

執(zhí)行 func 后,func 的作用域釋放(或許遺忘更合適),并返回了綁定了 vv2 變量的閉包函數(shù) inn_func,此時(shí)閉包所具有命名空間即為閉包命名空間,因此局部命名空間和閉包命名空間是相對(duì)而言的,對(duì)于父函數(shù) func 而言,兩者具有產(chǎn)生時(shí)間上的差異。

LEGB 訪問(wèn)規(guī)則

通過(guò)上面描述,我們發(fā)現(xiàn) LEGB 四類(lèi)命名空間本身具有明顯的內(nèi)外層級(jí)概念,而這種層級(jí)概念正是構(gòu)建作用域的前提:作用域依據(jù)這種層級(jí)概念將不同類(lèi)型的命名空間組織起來(lái)并劃歸到不同層級(jí)的作用域,然后定義好不同層級(jí)作用域之間的訪問(wèn)規(guī)則,從而實(shí)現(xiàn)命名空間的直接訪問(wèn):
LEGB 訪問(wèn)規(guī)則: 同樣的標(biāo)識(shí)符在各層命名空間中可以被重復(fù)使用而不會(huì)發(fā)生沖突,但 Python 尋找一個(gè)標(biāo)識(shí)符的過(guò)程總是從當(dāng)前層開(kāi)始逐層往上找,直到首次找到這個(gè)標(biāo)識(shí)符為止

#d.py
v1 = 1
v2 = 3
def f():
    v1 = 2
    print(1, v1)
    print(2, v2)

f()
print(3, v1)
1 2
2 3
3 1

上例中,全局變量和函數(shù) f 都定義了 變量 v1,結(jié)果 Python 會(huì)優(yōu)先選擇 f 的局部變量 v1 ,對(duì)于 f 內(nèi)并未定義的變量 v2 ,Python 會(huì)向上搜尋全局命名空間,讀取全局變量 v2 后打印輸出。

global 和 nonlocal 語(yǔ)句 global 和 nonlocal 的作用

如前所述,對(duì)于上層變量,python 允許直接讀取,但是卻不可以在內(nèi)層作用域直接改寫(xiě)上層變量,來(lái)看一個(gè)典型的閉包結(jié)構(gòu):

#e.py
gv = ["a", "global", "var"]

def func(v):
    gv = ["gv"] + gv #UnboundLocalError:local variable "gv" referenced before assignment
    lv = []
    def inn_func():
        lv = lv + [v]  #UnboundLocalError:local variable "lv" referenced before assignment
        gv.insert(1, lv[0])
        return gv
    return inn_func

實(shí)際調(diào)用 func()函數(shù)后,上面兩處對(duì) gvlv 進(jìn)行賦值操作的地方都會(huì)發(fā)生 UnboundLocalError:因?yàn)?Python 在執(zhí)行函數(shù)前,會(huì)首先生成各層命名空間和作用域,因此 Python 在執(zhí)行賦值前會(huì)將func 內(nèi)的 "gv" "lv" 寫(xiě)入局部命名空間和閉包命名空間,當(dāng) Python 執(zhí)行賦值時(shí)會(huì)在局部作用域、閉包作用域內(nèi)發(fā)現(xiàn)局部命名空間和閉包命名空間內(nèi)已經(jīng)具有"gv""lv" 標(biāo)識(shí)符,但這兩個(gè)非全局標(biāo)識(shí)符在該賦值語(yǔ)句執(zhí)行之前并沒(méi)有被賦值,也即沒(méi)有對(duì)象與標(biāo)識(shí)符關(guān)聯(lián),因此無(wú)法參與四則運(yùn)算,從而引發(fā)錯(cuò)誤;但這段程序本意可能只是想讓具有對(duì)象的全局變量gv 和局部變量 lv 參與運(yùn)算,為了避免類(lèi)似的情況發(fā)生,Python 便引入了 global、nonlocal 語(yǔ)句就來(lái)說(shuō)明所修飾的 gv、lv 分別來(lái)自全局命名空間和局部命名空間,聲明之后,就可以在 funcinn_func 內(nèi)直接改寫(xiě)上層命名空間內(nèi) gvlv 的值:

#f.py
gv = ["a", "global", "var"]

def func(v):
    global gv
    gv = ["gv"] + gv
    lv = []
    print(id(lv))
    def inn_func():
        nonlocal lv
        lv = lv + [v]
        print(id(lv))
        gv.insert(1, lv[0])
        return gv
    return inn_func
a = func("is")
# 2608229974344

a()
# 2608229974344
# ["gv", "is", "a", "global", "var"]

print(gv)
# ["gv", "is", "a", "global", "var"]

如上,全局變量 gv 值被函數(shù)改寫(xiě)了, inn_func 修改的也確實(shí)是父函數(shù) lv的值 (依據(jù) ID 判斷)。

借殼

那么是不是不使用 globalnonlocal 就不能達(dá)到上面的目的呢?來(lái)看看這段程序:

#g.py
gv = ["a", "global", "var"]

def func(v):
    gv.insert(0, "gv")
    lv = []
    print(id(lv))
    def inn_func():
        lv.append(v)
        print(id(lv))
        gv.insert(1, lv[0])
        return gv
    return inn_func

執(zhí)行的結(jié)果:

a = func("is")
# 2608110869168

a()
# 2608110869168
# ["gv", "is", "a", "global", "var"]

print(gv)
# ["gv", "is", "a", "global", "var"]

可以發(fā)現(xiàn),執(zhí)行結(jié)果同上面完全一致,問(wèn)題自然來(lái)了:“為什么不用 global nonlocal 也可以改寫(xiě)全局變量gv和父函數(shù)變量lv的值?

為了看清楚這個(gè)過(guò)程,我們將上面的gv.insert(0, "gv") lv.append(v) 改寫(xiě)為 gv[0:0] = ["gv"] lv[:] = [v]:

#h.py
gv = ["a", "global", "var"]

def func(v):
    gv[0:0] = ["gv"]
    lv = []
    print(id(lv))
    def inn_func():
        lv[:] = [v]
        print(id(lv))
        gv.insert(1, lv[0])
        return gv
    return inn_func

執(zhí)行結(jié)果:

a = func("is")
# 2608229959496

a()
# 2608229959496
# ["gv", "is", "a", "global", "var"]

同 g.py 文件的執(zhí)行結(jié)果完全一致,事實(shí)上兩者之間的內(nèi)在也是完全一樣的。
So 我們其實(shí)改寫(xiě)的不是 gvlv ,而是 gvlv 的元素 gv[0:0]lv[:] 。因此,不需要 globalnonlocal 修飾就可以直接改寫(xiě),這就是“借殼”,nonlocal 尚未引入 Python 中,比如 Python 2.x 若要在子函數(shù)中改寫(xiě)父函數(shù)變量的值就得通過(guò)這種方法。
當(dāng)然借殼蘊(yùn)藏著一個(gè)相對(duì)復(fù)雜的標(biāo)識(shí)符創(chuàng)建的問(wèn)題:比如子函數(shù)通過(guò)借殼修改父函數(shù)變量lv的值,那么子函數(shù)的標(biāo)識(shí)符lv是怎么綁定到父函數(shù)變量lv的值 ID 的上的?

關(guān)于這個(gè)問(wèn)題,這里有個(gè)問(wèn)答就是討論這個(gè)的:python的嵌套函數(shù)中局部作用域問(wèn)題?

global 和 nonlocal 語(yǔ)句對(duì)標(biāo)識(shí)符創(chuàng)建的不同影響

另外,需要注意的是:global 語(yǔ)句只是聲明該標(biāo)識(shí)符引用的變量來(lái)自于全局變量,但并不能直接在當(dāng)前層創(chuàng)建該標(biāo)識(shí)符;nonlocal 語(yǔ)句則會(huì)在子函數(shù)命名空間中創(chuàng)建與父函數(shù)變量同名的標(biāo)識(shí)符:

#j.py
gv = "a global var"

def func():
    global gv
    lv = "a local var"
    print(locals())
    def inn_func():
        nonlocal lv
        global gv
        print(locals())
    return inn_func

執(zhí)行結(jié)果:

c = func()
{"lv": "a local var"}   #運(yùn)行 `func` 函數(shù)后,`global` 語(yǔ)句并未將 `gv` 變量引入局部命名空間

c()
{"lv": "a local var"}   #運(yùn)行閉包函數(shù)后,`nonlocal` 語(yǔ)句將父函數(shù)變量 `lv` 引入閉包命名空間

之所以 nonlocal 語(yǔ)句與 global 語(yǔ)句的處置不同,在于全局變量的作用域生存期很長(zhǎng),在模塊內(nèi)隨時(shí)都可以訪問(wèn),而父函數(shù)的局部作用域在父函數(shù)執(zhí)行完畢后便會(huì)直接釋放,因此 nonlocal 語(yǔ)句必須將父函數(shù)變量的標(biāo)識(shí)符和引用寫(xiě)入閉包命名空間。

命名空間的生命周期 創(chuàng)建規(guī)則

實(shí)際上,到這里其實(shí)還有一個(gè)重要的重要問(wèn)題沒(méi)有解決:“標(biāo)識(shí)符并不是天生就在命名空間內(nèi)的,命名空間也不是平白無(wú)故就產(chǎn)生的,那么命名空間是在什么時(shí)候被創(chuàng)建?又是在什么時(shí)候被刪除的呢?”
規(guī)則有四:

內(nèi)建命名空間在 Python 解釋器啟動(dòng)時(shí)創(chuàng)建,之后會(huì)一直存在;

模塊的全局命名空間在模塊定義被讀入時(shí)創(chuàng)建,通常模塊命名空間也會(huì)保持到解釋器退出。

函數(shù)調(diào)用時(shí)產(chǎn)生新的局部命名空間;函數(shù)返回結(jié)果、拋出異常時(shí)釋放命名空間,每一次遞歸都生成一個(gè)命名空間。

標(biāo)識(shí)符產(chǎn)生地點(diǎn)決定標(biāo)識(shí)符所處的命名空間。

這四點(diǎn)就是拿來(lái)秒懂的!不過(guò),仍然有一點(diǎn)常常被忽視:類(lèi)的命名空間:

類(lèi)的局部命名空間

首先,函數(shù)和類(lèi)執(zhí)行時(shí)都會(huì)產(chǎn)生局部命名空間,但類(lèi)的執(zhí)行機(jī)制不同于函數(shù):

#i.py
def a():
    print("function")

class A():
    print(1)
    class B():
        print(2)
        class C():
            print(3)

執(zhí)行文件,結(jié)果為:

1
2
3

如上,類(lèi)就是一個(gè)可執(zhí)行的代碼塊,只要該類(lèi)被加載,就會(huì)被執(zhí)行,這一點(diǎn)不同于函數(shù)。
類(lèi)之所以這么設(shè)計(jì)的原因在于:類(lèi)是創(chuàng)建其他實(shí)例(生成其他的類(lèi)或者具體的對(duì)象)的對(duì)象,因此必須在實(shí)例之前被創(chuàng)建,而類(lèi)又可能涉及到與其他類(lèi)的繼承、重載等一系列問(wèn)題,故在代碼加載時(shí)就被創(chuàng)建利于提高效率和降低邏輯復(fù)雜度。

其次,與函數(shù)不同的是,類(lèi)的局部命名空間并非作用域

class A():
    a = 1
    b = [a + i for i in range(3)]  #NameError: name "a" is not defined

執(zhí)行上段代碼,我們可以發(fā)現(xiàn)在類(lèi) A 內(nèi)列表推導(dǎo)式無(wú)法調(diào)取 a 的值,但函數(shù)卻可以:

def func():
    a = 1
    b = [a + i for i in range(3)]
    print(b)

func()  #[1, 2, 3]

因此,A 中的 a 不同于函數(shù) func 中的 a 在局部命名空間中可以被任意讀取,之所以說(shuō)是“不可以被任意”讀取而不是“不可被讀取”,原因在于在類(lèi)A 的局部空間內(nèi),a 其實(shí)一定程度上是可以直接被讀取的:

class A():
    a = 1
    c = a + 2

執(zhí)行上段代碼后:

A.c 
#3

而上例中 b 的賦值操作不能執(zhí)行,原因在于列表推導(dǎo)式會(huì)創(chuàng)建自己的局部命名空間,因此難以訪問(wèn)到 a。

編譯與局部命名空間

Python 是動(dòng)態(tài)語(yǔ)言,很多行為是動(dòng)態(tài)發(fā)生的,但 Python 自身也在不斷進(jìn)步,比如為了提高效率,有些行為會(huì)在編譯時(shí)候完成,局部變量的創(chuàng)建就是如此:

def func():
    a = 1
    def inn_func():
        print(a)  # error
        a = 2     # error
    inn_func()

上段程序還未執(zhí)行,就提示存在有語(yǔ)法錯(cuò)誤,原因在于python 解釋器發(fā)現(xiàn) inn_func 內(nèi)存在自身的 a 變量,但卻在聲明之前就被 print 了。

總結(jié)

啰嗦了這么多,終于該結(jié)尾了!
我們?cè)賮?lái)回過(guò)頭來(lái)看下文章開(kāi)頭的栗子:
1、為什么 b.py 只是導(dǎo)入 a.py 中的 class A,卻執(zhí)行了整個(gè) a.py 文件?
答:因?yàn)?Python 并不知道 class A 在 a.py 文檔的何處,為了能夠找到 class A,Python 需要執(zhí)行整個(gè)文檔。
2、為什么 b.py 的導(dǎo)入執(zhí)行了整個(gè) a.py 文檔,卻在 b 中難以調(diào)用 a 的全局變量 va
答:Python 的全局變量指的是模塊全局,因此不可以跨文檔,因此 global 語(yǔ)句也是不可以跨文檔的。另外, b 只是導(dǎo)入了 a 的 class A,因此并不會(huì)導(dǎo)入 a 中所有的標(biāo)識(shí)符,所以 類(lèi)似a.va 這樣的調(diào)用也是不起作用的。

關(guān)于命名空間:
1、賦值、定義類(lèi)和函數(shù)都會(huì)產(chǎn)生新的標(biāo)識(shí)符;
2、全局變量的標(biāo)識(shí)符不能跨文檔;
3、各級(jí)命名空間相互獨(dú)立互不影響;
4、Python 總是從當(dāng)前層逐漸向上尋找標(biāo)識(shí)符;
5、內(nèi)層作用域若想直接修改上層變量,需要通過(guò) global nonlocal 語(yǔ)句先聲明;
6、單純的 global 語(yǔ)句并不能為所在層級(jí)創(chuàng)建相應(yīng)標(biāo)識(shí)符,但 nonlocal 語(yǔ)句可以在閉包空間中創(chuàng)建相應(yīng)標(biāo)識(shí)符;
7、類(lèi)的局部命名空間不是作用域。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/37781.html

相關(guān)文章

  • python基礎(chǔ)知識(shí)之函數(shù)初階——命名空間

    摘要:在內(nèi)置命名空間不能使用全局和局部的名字??梢孕蜗蟮乩斫獬蓛?nèi)置命名空間具有最高級(jí)別,不需要定義就可以使用,全局命名空間次之,最低級(jí)是局部命名空間。 python中的命名空間分三種: 內(nèi)置的命名空間,在啟動(dòng)解釋器的時(shí)候自動(dòng)加載進(jìn)內(nèi)存的各種名字所在的空間,比如print,input等不需要定義就可以使用的名字 全局命名空間,就是從上到下所有我們定義的變量名和函數(shù)名所在的空間,是在程序從上到下...

    dack 評(píng)論0 收藏0
  • python基礎(chǔ)教程:作用域和命名空間

    摘要:正如我們前面舉的張三的例子那樣,不同命名空間中的名稱(chēng)之間沒(méi)有任何關(guān)系。作用域作用域,是一個(gè)命名空間可直接發(fā)放完的代碼的文本區(qū)域。刪除也是如此,語(yǔ)句會(huì)從局部命名空間的引用中移除對(duì)的綁定。 命名空間和作用域的概念我們之前也提到過(guò),比如內(nèi)置函數(shù)globals(),函數(shù)中變量的作用域,模塊使用的import等等。這些可能讓我們對(duì)這兩個(gè)概念有了大致的理解。本節(jié)再詳細(xì)探討一下。 showImg(h...

    wangzy2019 評(píng)論0 收藏0
  • 深度辨析 Python eval() 與 exec()

    摘要:內(nèi)置函數(shù)們能夠被提拔出來(lái),這就意味著它們皆有獨(dú)到之處,有用武之地。因此,掌握內(nèi)置函數(shù)的用法,就成了我們應(yīng)該點(diǎn)亮的技能。報(bào)錯(cuò)包含了內(nèi)置命名空間中的名稱(chēng),在控制臺(tái)中輸入,就能發(fā)現(xiàn)很多內(nèi)置函數(shù)異常和其它屬性的名稱(chēng)。 Python 提供了很多內(nèi)置的工具函數(shù)(Built-in Functions),在最新的 Python 3 官方文檔中,它列出了 69 個(gè)。 大部分函數(shù)是我們經(jīng)常使用的,例如 p...

    AndroidTraveler 評(píng)論0 收藏0
  • Python與家國(guó)天下

    摘要:正如儒家經(jīng)典所闡述修身齊家治國(guó)平天下。除此之外,模塊還有如下最基本的屬性在一個(gè)模塊的全局空間里,有些屬性是全局起作用的,稱(chēng)之為全局變量,而其它在局部起作用的屬性,會(huì)被稱(chēng)為局部變量。 導(dǎo)讀:Python貓是一只喵星來(lái)客,它愛(ài)地球的一切,特別愛(ài)優(yōu)雅而無(wú)所不能的 Python。我是它的人類(lèi)朋友豌豆花下貓,被授權(quán)潤(rùn)色與發(fā)表它的文章。如果你是第一次看到這個(gè)系列文章,那我強(qiáng)烈建議,請(qǐng)先看看它寫(xiě)的前...

    姘擱『 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<