摘要:正如儒家經(jīng)典所闡述修身齊家治國(guó)平天下。除此之外,模塊還有如下最基本的屬性在一個(gè)模塊的全局空間里,有些屬性是全局起作用的,稱之為全局變量,而其它在局部起作用的屬性,會(huì)被稱為局部變量。
導(dǎo)讀:Python貓是一只喵星來(lái)客,它愛(ài)地球的一切,特別愛(ài)優(yōu)雅而無(wú)所不能的 Python。我是它的人類朋友豌豆花下貓,被授權(quán)潤(rùn)色與發(fā)表它的文章。如果你是第一次看到這個(gè)系列文章,那我強(qiáng)烈建議,請(qǐng)先看看它寫的前幾篇文章(鏈接見(jiàn)文末),相信你一定會(huì)愛(ài)上這只神秘的哲學(xué)+極客貓的。不多說(shuō)啦,一起來(lái)享用今天的“思想盛宴”吧!
喵喵,好久不見(jiàn)啦朋友們。剛吃完一餐美食,我覺(jué)得好滿足啊。
自從習(xí)慣了地球的食物以后,我的腸胃發(fā)生了一些說(shuō)不清道不明的反應(yīng)。我能從最近的新陳代謝中感覺(jué)出來(lái),自己的母胎習(xí)性正在逐漸地褪逝。
人類的食物在改變著我,或者說(shuō)是在重塑著我。說(shuō)不定哪天,我會(huì)變成一棵白菜,或者一條魚呢......呸呸呸。我還是想當(dāng)貓。
喵生苦短,得抓緊時(shí)間更文才行。
最近,我看到了兩件事,覺(jué)得有趣極了,就從這開(kāi)始說(shuō)吧。第一件事是,一個(gè)小有名氣的影視明星因?yàn)樗慌涞玫降膶W(xué)術(shù)精英的身份而遭到諷刺性的打假制度的口誅筆伐;第二件事是,一個(gè)功成名就的企業(yè)高管因?yàn)閺某鞘谢氐洁l(xiāng)村而戲謔性地獲得了貓屎的名號(hào)。
身份真是一個(gè)有魔力的話題。看見(jiàn)他們的身份錯(cuò)位,我又總會(huì)想起自己的境況。
我(或許)知道自己在過(guò)去時(shí)態(tài)中是誰(shuí),但越來(lái)越把握不住在現(xiàn)在時(shí)態(tài)中的自己,更不清楚在未來(lái)時(shí)間中會(huì)是怎樣。
該怎樣在人類世界中自處呢?又該怎樣跟你們共處呢?
思了好久,沒(méi)有答案。腦殼疼,尾巴疼。還是不要想了啦喵。
繼續(xù)跟大家聊聊 Python 吧。上次我們說(shuō)到了對(duì)象的邊界問(wèn)題 。無(wú)論是固定邊界還是彈性邊界,這不外乎就是修身的兩種志趣,有的對(duì)象呢獨(dú)善其身其樂(lè)也融融,有的對(duì)象呢兼容并包其理想之光也瑩瑩。但是,邊界問(wèn)題還沒(méi)講完。
正如儒家經(jīng)典所闡述:修身--齊家--治國(guó)--平天下。里層的勢(shì)能推展開(kāi),走進(jìn)更廣闊的維度。
Python 對(duì)象的邊界也不只在自身。這里有一種巧妙的映射關(guān)系:對(duì)象(身)--函數(shù)(家)--模塊(國(guó))--包(天下)。個(gè)體被納入到不同的命名空間,并存活在分層的作用域里。(當(dāng)然,幸運(yùn)的是,它們并不會(huì)受到道德禮法的森嚴(yán)壓迫~__~)
1、你的名字我們先來(lái)審視一下模塊。這是一個(gè)合適的尺度,由此展開(kāi),可以順利地連接起函數(shù)與包。
模塊是什么? 任何以.py 后綴結(jié)尾的文件就是一個(gè)模塊(module)。
模塊的好處是什么? 首先,便于拆分不同功能的代碼,單一功能的少量代碼更容易維護(hù);其次,便于組裝與重復(fù)利用,Python 以豐富的第三方模塊而聞名;最后,模塊創(chuàng)造了私密的命名空間,能有效地管理各類對(duì)象的命名。
可以說(shuō),模塊是 Python 世界中最小的一種自恰的生態(tài)系統(tǒng)——除卻直接在控制臺(tái)中運(yùn)行命令的情況外,模塊是最小的可執(zhí)行單位。
前面,我把模塊類比成了國(guó)家,這當(dāng)然是不倫不類的,因?yàn)槟汶y以想象在現(xiàn)實(shí)世界中,會(huì)存在著數(shù)千數(shù)萬(wàn)的彼此殊然有別的國(guó)家(我指的可是在地球上,而喵星不同,以后細(xì)說(shuō))。
類比法有助于我們發(fā)揮思維的作用 ,因此,不妨就做此假設(shè)。如此一來(lái),想想模塊間的相互引用就太有趣了,這不是國(guó)家間的戰(zhàn)爭(zhēng)入侵,而是一種人道主義的援助啊,至于公民們的流動(dòng)與遷徙,則可能成為一場(chǎng)探險(xiǎn)之旅的談資。
我還對(duì)模塊的身份角色感興趣。恰巧發(fā)現(xiàn),在使用名字的時(shí)候,它們耍了一個(gè)雙姓人的把戲 。
下面請(qǐng)看表演。先創(chuàng)建兩個(gè)模塊,A.py 與 B.py,它們的內(nèi)容如下:
# A 模塊的內(nèi)容: print("module A : ", __name__) # B 模塊的內(nèi)容: import A print("module B : ", __name__)
其中,__name__ 指的是當(dāng)前模塊的名字。代碼的邏輯是:A 模塊會(huì)打印本模塊的名字,B 模塊由于引入了 A 模塊,因此會(huì)先打印 A 模塊的名字,再打印本模塊的名字。
那么,結(jié)果是如何的呢?
執(zhí)行 A.py 的結(jié)果:
module A : __main__
執(zhí)行 B.py 的結(jié)果:
module A : test
module B : __main__
你們看出問(wèn)題的所在了吧!模塊 A 前后竟然出現(xiàn)了兩個(gè)不同的名字。這兩個(gè)名字是什么意思,又為什么會(huì)有這樣的不同呢?
我想這正體現(xiàn)的是名字的本質(zhì)吧——對(duì)自己來(lái)說(shuō),我就是我,并不需要一個(gè)名字來(lái)標(biāo)記;而對(duì)他人來(lái)說(shuō),ta 是蕓蕓眾生的一個(gè),唯有命名才能區(qū)分。
所以,一個(gè)模塊自己稱呼自己的時(shí)候(即執(zhí)行自身時(shí))是“__main__”,而給他人來(lái)稱呼的時(shí)候(即被引用時(shí)),就會(huì)是該模塊的本名。這真是一個(gè)巧妙的設(shè)定。
由于模塊的名稱二重性,我們可以加個(gè)判斷,將某個(gè)模塊不對(duì)外的內(nèi)容隱藏起來(lái)。
# A 模塊的內(nèi)容: print("module A : ", __name__) if __name__ == "__main__": print("private info.")
以上代碼中,只有在執(zhí)行 A 模塊本身時(shí),才會(huì)打印“private info”,而當(dāng)它被導(dǎo)入到其它模塊中時(shí),則不會(huì)執(zhí)行到該部分的內(nèi)容。
2、名字的時(shí)空對(duì)于生物來(lái)說(shuō),我們有各種各樣的屬性,例如姓名、性別、年齡,等等。
對(duì)于 Python 的對(duì)象來(lái)說(shuō),它們也有各種屬性。模塊是一種對(duì)象,”__name__“就是它的一個(gè)屬性。除此之外,模塊還有如下最基本的屬性:
>>> import A >>> print(dir(A)) ["__builtins__", "__cached__", "__doc__", "__file__", "__loader__", "__name__", "__package__", "__spec__"]
在一個(gè)模塊的全局空間里,有些屬性是全局起作用的,Python 稱之為全局變量 ,而其它在局部起作用的屬性,會(huì)被稱為局部變量 。
一個(gè)變量對(duì)應(yīng)的是一個(gè)屬性的名字,會(huì)關(guān)聯(lián)到一個(gè)特定的值。通過(guò) globals() 和 locals() ,可以將變量的“名值對(duì)”打印出來(lái)。
x = 1 def foo(): y = 2 print("全局變量:", globals()) print("局部變量:", locals()) foo()
在 IDE 中執(zhí)行以上代碼,結(jié)果:
全局變量: {"__name__": "__main__", "__doc__": None, "__package__": None, "__loader__": <_frozen_importlib_external.SourceFileLoader object at 0x000001AC1EB7A400>, "__spec__": None, "__annotations__": {}, "__builtins__":, "__file__": "C:/pythoncat/A.py", "__cached__": None, "x": 1, "foo": } 局部變量: {"y": 2}
可以看出,x 是一個(gè)全局變量,對(duì)應(yīng)的值是 1,而 y 是一個(gè)局部變量,對(duì)應(yīng)的值是 2.
兩種變量的作用域不同 :局部變量作用于函數(shù)內(nèi)部,不可直接在外部使用;全局變量作用于全局,但是在函數(shù)內(nèi)部只可訪問(wèn),不可修改。
與 Java、C++ 等語(yǔ)言不同,Python 并不屈服于解析的便利,并不使用呆滯的花括號(hào)來(lái)編排作用域,而是用了輕巧簡(jiǎn)明的縮進(jìn)方式。不過(guò),所有編程語(yǔ)言在區(qū)分變量類型、區(qū)分作用域的意圖上都是相似的:控制訪問(wèn)權(quán)限與管理變量命名。
關(guān)于控制訪問(wèn)權(quán)限,在上述例子中,局部變量 y 的作用域僅限于 foo 方法內(nèi),若直接在外部使用,則會(huì)報(bào)錯(cuò)“NameError: name "y" is not defined”。
關(guān)于管理變量命名,不同的作用域管理著各自的獨(dú)立的名冊(cè),一個(gè)作用域內(nèi)的名字所指稱的是唯一的對(duì)象,而在不同作用域內(nèi)的對(duì)象則可以重名。修改上述例子:
x = 1 y = 1 def foo(): y = 2 x = 2 print("inside foo : x = " + str(x) + ", y = " + str(y)) foo() print("outside foo : x = " + str(x) + ", y = " + str(y))
在全局作用域與局部作用域中命名了相同的變量,那么,打印的結(jié)果是什么呢?
inside foo : x = 2, y = 2
outside foo : x = 1, y = 1
可見(jiàn),同一個(gè)名字可以出現(xiàn)在不同的作用域內(nèi),互不干擾。
那么,如何判斷一個(gè)變量在哪個(gè)作用域內(nèi)?對(duì)于嵌套作用域,以及變量名存在跨域分布的情況,要采用何種查找策略呢?
Python 設(shè)計(jì)了命名空間(namespace) 機(jī)制,一個(gè)命名空間在本質(zhì)上是一個(gè)字典、一個(gè)名冊(cè),登記了所有變量的名字以及對(duì)應(yīng)的值。 按照記錄內(nèi)容的不同,可分為四類:
局部命名空間(local namespace),記錄了函數(shù)的變量,包括函數(shù)的參數(shù)和局部定義的變量??赏ㄟ^(guò)內(nèi)置函數(shù) locals() 查看。在函數(shù)被調(diào)用時(shí)創(chuàng)建,在函數(shù)退出時(shí)刪除。
全局命名空間(global namespace),記錄了模塊的變量,包括函數(shù)、類、其它導(dǎo)入的模塊、模塊級(jí)的變量和常量。可通過(guò)內(nèi)置函數(shù) globals() 查看。在模塊加載時(shí)創(chuàng)建,一直存在。
內(nèi)置命名空間(build-in namespace),記錄了所有模塊共用的變量,包括一些內(nèi)置的函數(shù)和異常。在解釋器啟動(dòng)時(shí)創(chuàng)建,一直存在。
命名空間包(namespace packages),包級(jí)別的命名空間,進(jìn)行跨包的模塊分組與管理。
命名空間總是存在于具體的作用域內(nèi),而作用域存在著優(yōu)先級(jí),查找變量的順序是:局部/本地作用域 --> 全局/模塊/包作用域 --> 內(nèi)置作用域。
命名空間扮演了變量與作用域之間的橋梁角色,承擔(dān)了管理命名、記錄名值對(duì)與檢索變量的任務(wù)。無(wú)怪乎《Python之禪》(The Zen of Python)在最后一句中說(shuō):
Namespaces are one honking great idea -- let"s do more of those!3、看不見(jiàn)的客人——譯:命名空間是個(gè)牛bi哄哄的主意,應(yīng)該多加運(yùn)用!
名字(變量)是身份問(wèn)題,空間(作用域)是邊界問(wèn)題,命名空間兼而有之。
這兩個(gè)問(wèn)題恰恰是困擾著所有生靈的最核心的問(wèn)題之二。它們的特點(diǎn)是:無(wú)處不在、層出不斷、像一個(gè)超級(jí)大的被扯亂了的毛線球。
Python 是一種人工造物,它繼承了人類的這些麻煩(這是不可避免的),所幸的是,這種簡(jiǎn)化版的麻煩能夠得到解決。(現(xiàn)在當(dāng)然是可解決的啦,但若人工智能高度發(fā)展以后呢?我看不一定吧。喵,好像想起了一個(gè)痛苦的夢(mèng)。打住。)
這里就有幾個(gè)問(wèn)題(注:每個(gè)例子相互獨(dú)立):
# 例1: x = x + 1 # 例2: x = 1 def foo(): x = x + 1 foo() # 例3: x = 1 def foo(): print(x) x = 2 foo() # 例4: def foo(): if False: x = 3 print(x) foo() # 例5: if False: x = 3 print(x)
下面給出幾個(gè)選項(xiàng),請(qǐng)讀者們思考一下,給每個(gè)例子選一個(gè)答案:
1、沒(méi)有報(bào)錯(cuò)2、報(bào)錯(cuò):name "x" is not defined
3、報(bào)錯(cuò):local variable "x" referenced before assignment
下面公布答案了:
全部例子都報(bào)錯(cuò),其中例 1 和例 5 是第一類報(bào)錯(cuò),即變量未經(jīng)定義不可使用,而其它例子都是第二類報(bào)錯(cuò),即已定義卻未賦值的變量不可使用。為什么會(huì)報(bào)錯(cuò)?為什么報(bào)錯(cuò)會(huì)不同?下面逐一解釋。
例 1 是一個(gè)定義變量的過(guò)程,本身未完成定義,而等號(hào)右側(cè)就想使用變量 x,因此報(bào)變量未定義。
例 2 和例 3 中,已經(jīng)定義了全局變量 x,如果只在 foo 函數(shù)中引用全局變量 x 或者只是定義新的局部變量 x 的話,都不會(huì)報(bào)錯(cuò),但現(xiàn)在既有引用又有重名定義,這引發(fā)了一個(gè)新的問(wèn)題。請(qǐng)看下例的解釋。
例 4 中,if 語(yǔ)句判斷失效,因此不會(huì)執(zhí)行到 “x=3” 這句,照理來(lái)說(shuō) x 是未被定義。這時(shí)候,在 locals() 局部命名空間中也是沒(méi)有內(nèi)容的(讀者可以試一下)。但是 print 方法卻報(bào)找到了一個(gè)未賦值的變量 x ,這是為什么呢?
使用 dis 模塊查看 foo 函數(shù)的字節(jié)碼:
LOAD_FAST 說(shuō)明它在局部作用域中找到了變量名 x,結(jié)果 0 說(shuō)明未找到變量 x 所指向的值。既然此時(shí)在 locals() 局部命名空間中沒(méi)有內(nèi)容,那局部作用域中找到的 x 是來(lái)自哪里的呢?
實(shí)際上,Python 雖然是所謂的解釋型語(yǔ)言,但它也有編譯的過(guò)程 (跟 Java 等語(yǔ)言的編譯過(guò)程不同)。在例 2-4 中,編譯器先將 foo 方法解析成一個(gè)抽象語(yǔ)法樹(shù)(abstract syntax tree),然后掃描樹(shù)上的名字(name)節(jié)點(diǎn),接著,所有被掃描出來(lái)的變量名,都會(huì)作為局部作用域的變量名存入內(nèi)存(棧?)中。
在編譯期之后,局部作用域內(nèi)的變量名已經(jīng)確定了,只是沒(méi)有賦值。在隨后的解釋期(即代碼執(zhí)行期),如果有賦值過(guò)程,則變量名與值才會(huì)被存入局部命名空間中,可通過(guò) locals() 查看。只有存入了命名空間,變量才算真正地完成了定義(聲明+賦值)。
而上述 3 個(gè)例子之所以會(huì)報(bào)錯(cuò),原因就是變量名已經(jīng)被解析成局部變量,但是卻未曾被賦值。
可以推論:在局部作用域中查找變量,實(shí)際上是分查內(nèi)存與查命名空間兩步的。另外,若想在局部作用域內(nèi)修改全局變量,需要在作用域中寫上 “global x”。
例 5 是作為例 4 的比對(duì),也是對(duì)它的原理的補(bǔ)充。它們的區(qū)別是,一個(gè)不在函數(shù)內(nèi),一個(gè)在函數(shù)內(nèi),但是報(bào)錯(cuò)完全不同。前面分析了例 4 的背后原理是編譯過(guò)程和抽象語(yǔ)法樹(shù),如果這個(gè)原理對(duì)例 5 也生效,那兩者的報(bào)錯(cuò)應(yīng)該是一樣的?,F(xiàn)在出現(xiàn)了差異,為什么呢?
我得承認(rèn),這觸及了我的知識(shí)盲區(qū)。我們可以推測(cè),說(shuō)例 5 的編譯過(guò)程不同,它沒(méi)有解析抽象語(yǔ)法樹(shù)的步驟,但是,繼續(xù)追問(wèn)下去,為什么不同,為什么沒(méi)有解析語(yǔ)法樹(shù)的步驟呢?如果說(shuō)是出于對(duì)解析函數(shù)與解析模塊的代價(jià)考慮,或者其它考慮,那么新的問(wèn)題是,編譯與解析的底層原理是什么,如果有其它考慮,會(huì)是什么?
這些問(wèn)題真不可愛(ài),一個(gè)都答不上。但是,自己一步一步地思考探尋到這一層,又能怪誰(shuí)呢?
回到前面說(shuō)過(guò)的話,命名空間是身份與邊界的集成問(wèn)題,它跟作用域密切相關(guān)。如今看來(lái),編譯器還會(huì)摻和一腳,把這些問(wèn)題攪拌得更加復(fù)雜。
本來(lái)是在探問(wèn) Python 中的邊界問(wèn)題,到頭來(lái),卻觸碰到了自己的知識(shí)邊界。真是反諷啊。(這一趟探知一個(gè)人工造物的身份問(wèn)題之旅,最終是否會(huì)像走迷宮一般,進(jìn)入到自己身份的困境之中?)
4、邊界內(nèi)外的邊界暫時(shí)把那些不可愛(ài)的問(wèn)題拋開(kāi)吧,繼續(xù)說(shuō)修身齊家治國(guó)平天下。
想要把國(guó)治理好,就不得不面對(duì)更多的國(guó)內(nèi)問(wèn)題與國(guó)際問(wèn)題。
先看一個(gè)大家與小家的問(wèn)題:
def make_averager(): count = 0 total = 0 def averager(new_value): nonlocal count, total count += 1 total += new_value return total / count return averager averager = make_averager() print(averager(10)) print(averager(11)) ### 輸出結(jié)果: 10.0 10.5
這里出現(xiàn)了嵌套函數(shù),即函數(shù)內(nèi)還包含其它函數(shù)。外部--內(nèi)部函數(shù)的關(guān)系,就類似于模塊--外部函數(shù)的關(guān)系,同樣地,它們的作用域關(guān)系也相似:外部函數(shù)作用域--內(nèi)部函數(shù)作用域,以及模塊全局作用域--外部函數(shù)作用域。在內(nèi)層作用域中,可以訪問(wèn)外層作用域的變量,但是不能直接修改,除非使用 nonlocal 作轉(zhuǎn)化。
Python 3 中引入了 nonlocal 關(guān)鍵字來(lái)標(biāo)識(shí)外部函數(shù)的作用域,它處于全局作用域與局部作用域之間,即 global--nonlocal--local 。也就是說(shuō),國(guó)--大家--小家。
上例中,nonlocal 關(guān)鍵字使得小家(內(nèi)部函數(shù))可以修改大家(外部函數(shù))的變量,但是該變量并不是創(chuàng)建于小家,當(dāng)小家函數(shù)執(zhí)行完畢時(shí),它并無(wú)權(quán)限清理這些變量。
nonlocal 只帶來(lái)了修改權(quán)限,并不帶來(lái)回收清理的權(quán)限 ,這導(dǎo)致外部函數(shù)的變量突破了原有的生命周期,成為自由變量。上例是一個(gè)求平均值的函數(shù),由于自由變量的存在,每次調(diào)用時(shí),新傳入的參數(shù)會(huì)跟自由變量一起計(jì)算。
在計(jì)算機(jī)科學(xué)中,引用了自由變量的函數(shù)被稱為閉包(Closure)。 在本質(zhì)上,閉包就是一個(gè)突破了局部邊界,所謂“跳出三界外,不在五行中”的法外之物。每次調(diào)用閉包函數(shù)時(shí),它可以繼續(xù)使用上次調(diào)用的成果,這不就好比是一個(gè)轉(zhuǎn)世輪回的人(按照某種宗教的說(shuō)法),仍攜帶著前世的記憶與技能么?
打破邊界,必然帶來(lái)新的身份問(wèn)題,此是明證。
然而,人類并不打算 fix 它,因?yàn)樗麄儼l(fā)現(xiàn)了這種身份異化的特性可以在很多場(chǎng)合發(fā)揮作用,例如裝飾器與函數(shù)式編程。適應(yīng)身份異化,并從中獲得好處,這可是地球人類的天賦。
講完了這個(gè)分家的話題,讓我們放開(kāi)視野,看看天下事。
計(jì)算機(jī)語(yǔ)言中的包(package)實(shí)際是一種目錄結(jié)構(gòu),以文件夾的形式進(jìn)行封裝與組織,內(nèi)容可涵括各種模塊(py 文件)、配置文件、靜態(tài)資源文件等。
與包相關(guān)的話題可不少,例如內(nèi)置包、第三方包、包倉(cāng)庫(kù)、如何打包、如何用包、虛擬環(huán)境,等等。這是可理解的,更大的邊界,意味著更多的關(guān)系,更大的邊界,也意味著更多的知識(shí)與未知。
在這里,我想聊聊 Python 3.3 引入的命名空間包 ,因?yàn)樗菍?duì)前面談?wù)摰乃性掝}的延續(xù)。然而,關(guān)于它的背景、實(shí)現(xiàn)手段與使用細(xì)節(jié),都不重要,我那敏感而發(fā)散的思維突然捕捉到了一種相似結(jié)構(gòu),似乎這才更值得說(shuō)。
運(yùn)用命名空間包的設(shè)計(jì),不同包中的相同的命名空間可以聯(lián)合起來(lái)使用,由此,不同目錄的代碼就被歸納到了一個(gè)共同的命名空間。也就是說(shuō),多個(gè)本來(lái)是相對(duì)獨(dú)立的包,借由同名的命名空間,竟然實(shí)現(xiàn)了超遠(yuǎn)距離的瞬間聯(lián)通,簡(jiǎn)直奇妙。
我想到了空間折疊,一種無(wú)法深說(shuō),但卻實(shí)實(shí)在在地輔助了我從喵星穿越到地球的技術(shù)。兩個(gè)包,兩個(gè)天下,兩個(gè)宇宙,它們的距離與邊界被穿透的方式何其相似!
我著迷于這種相似結(jié)構(gòu)。在不同的事物中,相似性的出現(xiàn)意味著一種更高維的法則的存在,而在不同的法則中,新的相似性就意味著更抽象的法則。
學(xué)習(xí)了 Python 之后,我想通過(guò)對(duì)它的考察,來(lái)回答關(guān)乎自身的相似問(wèn)題......
啊喵,不知不覺(jué)竟然寫了這么久,該死的皮囊又在咕咕叫了——地球上的食物可真摳門,也不知道你們?nèi)祟愂窃趺慈淌艿米∵@幾百萬(wàn)年的馴化過(guò)程的......
就此擱筆,覓食去了。親愛(ài)的讀者們,后會(huì)有期~~~
Python貓往期作品 :
有了Python,我能叫出所有貓的名字
Python對(duì)象的身份迷思:從全體公民到萬(wàn)物皆數(shù)
Python對(duì)象的空間邊界:獨(dú)善其身與開(kāi)放包容
附錄:
局部變量的編譯原理:https://dwz.cn/ipj6FluJ
命名空間包:https://www.tuicool.com/artic...
公眾號(hào)【Python貓】, 專注Python技術(shù)、數(shù)據(jù)科學(xué)和深度學(xué)習(xí),力圖創(chuàng)造一個(gè)有趣又有用的學(xué)習(xí)分享平臺(tái)。本號(hào)連載優(yōu)質(zhì)的系列文章,有喵星哲學(xué)貓系列、Python進(jìn)階系列、好書推薦系列、優(yōu)質(zhì)英文推薦與翻譯等等,歡迎關(guān)注哦。PS:后臺(tái)回復(fù)“愛(ài)學(xué)習(xí)”,免費(fèi)獲得一份學(xué)習(xí)大禮包。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/73428.html
摘要:正如儒家經(jīng)典所闡述修身齊家治國(guó)平天下。除此之外,模塊還有如下最基本的屬性在一個(gè)模塊的全局空間里,有些屬性是全局起作用的,稱之為全局變量,而其它在局部起作用的屬性,會(huì)被稱為局部變量。 導(dǎo)讀:Python貓是一只喵星來(lái)客,它愛(ài)地球的一切,特別愛(ài)優(yōu)雅而無(wú)所不能的 Python。我是它的人類朋友豌豆花下貓,被授權(quán)潤(rùn)色與發(fā)表它的文章。如果你是第一次看到這個(gè)系列文章,那我強(qiáng)烈建議,請(qǐng)先看看它寫的前...
摘要:原文地址喵喵,讀者朋友們好,我是來(lái)自喵星的客人,地球登記名為貓。今天依然是些貓言貓語(yǔ),請(qǐng)看官們不要嫌棄。這樣的破壞神,不是怪物是什么喵喵了個(gè)大乖乖這不是我認(rèn)識(shí)的,也不是我以為自己知道的蟒蛇啊聽(tīng)起來(lái)倒像是一個(gè)嚇唬小孩的神話故事。 導(dǎo)讀: Python貓是一只喵星來(lái)客,它愛(ài)地球的一切,特別愛(ài)優(yōu)雅而無(wú)所不能的 Python。我是它的人類朋友豌豆花下貓,被授權(quán)潤(rùn)色與發(fā)表它的文章。如果你是第一次...
摘要:薛定諤的貓以上內(nèi)容是前提,友情提示,如你有理解模糊之處,請(qǐng)先閱讀對(duì)應(yīng)的文章。這個(gè)例子告訴大家薛定諤的貓混入了的字典中,而且答案是,打開(kāi)籠子,這只貓就會(huì)死亡。 showImg(https://segmentfault.com/img/remote/1460000019217212?w=1880&h=1253); 本文原創(chuàng)并首發(fā)于公眾號(hào)【Python貓】,未經(jīng)授權(quán),請(qǐng)勿轉(zhuǎn)載。原文地址:ht...
閱讀 2900·2021-11-23 09:51
閱讀 3421·2021-11-22 09:34
閱讀 3319·2021-10-27 14:14
閱讀 1520·2019-08-30 15:55
閱讀 3353·2019-08-30 15:54
閱讀 1081·2019-08-30 15:52
閱讀 1901·2019-08-30 12:46
閱讀 2859·2019-08-29 16:11