這篇文章主要講解了“Python有哪些隱藏特性”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Python有哪些隱藏特性”吧!
成都創(chuàng)新互聯(lián)專注于云巖企業(yè)網(wǎng)站建設(shè),自適應(yīng)網(wǎng)站建設(shè),商城網(wǎng)站開發(fā)。云巖網(wǎng)站建設(shè)公司,為云巖等地區(qū)提供建站服務(wù)。全流程定制網(wǎng)站設(shè)計,專業(yè)設(shè)計,全程項目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)案例一:
案例二:
案例三:
很好理解, 對吧?
這些行為是由于 Cpython 在編譯優(yōu)化時, 某些情況下會嘗試使用已經(jīng)存在的不可變對象而不是每次都創(chuàng)建一個新對象. (這種行為被稱作字符串的駐留[string interning])
發(fā)生駐留之后, 許多變量可能指向內(nèi)存中的相同字符串對象. (從而節(jié)省內(nèi)存)
在上面的代碼中, 字符串是隱式駐留的. 何時發(fā)生隱式駐留則取決于具體的實現(xiàn). 這里有一些方法可以用來猜測字符串是否會被駐留:
所有長度為 0 和長度為 1 的字符串都被駐留.
字符串在編譯時被實現(xiàn) ('wtf'
將被駐留, 但是 ''.join(['w', 't', 'f'])
將不會被駐留)
字符串中只包含字母,數(shù)字或下劃線時將會駐留. 所以 'wtf!'
由于包含 !
而未被駐留. 可以在【地址1】找到 CPython 對此規(guī)則的實現(xiàn).
當(dāng)在同一行將 a
和 b
的值設(shè)置為 "wtf!"
的時候, Python 解釋器會創(chuàng)建一個新對象, 然后同時引用第二個變量(譯: 僅適用于3.7以下, 詳細情況請看【地址2】). 如果你在不同的行上進行賦值操作, 它就不會“知道”已經(jīng)有一個 wtf!
對象 (因為 "wtf!"
不是按照上面提到的方式被隱式駐留的). 它是一種編譯器優(yōu)化, 特別適用于交互式環(huán)境.
常量折疊(constant folding) 是 Python 中的一種 窺孔優(yōu)化(peephole optimization) 技術(shù). 這意味著在編譯時表達式 'a'*20
會被替換為 'aaaaaaaaaaaaaaaaaaaa'
以減少運行時的時鐘周期. 只有長度小于 20 的字符串才會發(fā)生常量折疊. (為啥? 想象一下由于表達式 'a'*10**10
而生成的 .pyc
文件的大小). 相關(guān)的源碼實現(xiàn)在【地址3】.
如果你是使用 3.7 版本中運行上述示例代碼, 會發(fā)現(xiàn)部分代碼的運行結(jié)果與注釋說明相同. 這是因為在 3.7 版本中, 常量折疊已經(jīng)從窺孔優(yōu)化器遷移至新的 AST 優(yōu)化器, 后者可以以更高的一致性來執(zhí)行優(yōu)化. (由 Eugene Toder 和 INADA Naoki 在 bpo-29469 和 bpo-11549 中貢獻.)
(譯: 但是在最新的 3.8 版本中, 結(jié)果又變回去了. 雖然 3.8 版本和 3.7 版本一樣, 都是使用 AST 優(yōu)化器. 目前不確定官方對 3.8 版本的 AST 做了什么調(diào)整.)
感謝各位的閱讀,以上就是“Python有哪些隱藏特性”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Python有哪些隱藏特性這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!