久久国产乱子伦精品免费M,亚洲一区二区三区91,欧美国产在线视频,国产精品视频久久

Python隱藏特性:字符串駐留、常量折疊

下面是Python字符串的一些微妙的特性,絕對會讓你大吃一驚。

案例一:

>>> a = "some_string"

>>> id(a)

140420665652016

>>> id("some" + "_" + "string") # 注意兩個的id值是相同的.

140420665652016

案例二:

>>> a = "wtf"

>>> b = "wtf"

>>> a is b

True

>>> a = "wtf!"

>>> b = "wtf!"

>>> a is b

False

>>> a, b = "wtf!", "wtf!"

>>> a is b

True # 3.7 版本返回結果為 False.

案例三:

>>> 'a' * 20 is 'aaaaaaaaaaaaaaaaaaaa'

True

>>> 'a' * 21 is 'aaaaaaaaaaaaaaaaaaaaa'

False # 3.7 版本返回結果為 True

很好理解, 對吧?

講解說明:

這些行為是由于 Cpython 在編譯優化時, 某些情況下會嘗試使用已經存在的不可變對象而不是每次都創建一個新對象. (這種行為被稱作字符串的駐留[string interning])

發生駐留之后, 許多變量可能指向內存中的相同字符串對象. (從而節省內存)

在上面的代碼中, 字符串是隱式駐留的. 何時發生隱式駐留則取決于具體的實現. 這里有一些方法可以用來猜測字符串是否會被駐留:所有長度為 0 和長度為 1 的字符串都被駐留.字符串在編譯時被實現 ('wtf' 將被駐留, 但是 ''.join(['w', 't', 'f']) 將不會被駐留)

字符串中只包含字母,數字或下劃線時將會駐留. 所以 'wtf!' 由于包含 ! 而未被駐留. 可以在【地址1】找到 CPython 對此規則的實現.

當在同一行將 a 和 b 的值設置為 "wtf!" 的時候, Python 解釋器會創建一個新對象, 然后同時引用第二個變量(譯: 僅適用于3.7以下, 詳細情況請看【地址2】). 如果你在不同的行上進行賦值操作, 它就不會“知道”已經有一個 wtf! 對象 (因為 "wtf!" 不是按照上面提到的方式被隱式駐留的). 它是一種編譯器優化, 特別適用于交互式環境.

常量折疊(constant folding) 是 Python 中的一種 窺孔優化(peephole optimization) 技術. 這意味著在編譯時表達式 'a'*20會被替換為 'aaaaaaaaaaaaaaaaaaaa' 以減少運行時的時鐘周期. 只有長度小于 20 的字符串才會發生常量折疊. (為啥? 想象一下由于表達式 'a'*10**10 而生成的 .pyc 文件的大小). 相關的源碼實現在【地址3】.

如果你是使用 3.7 版本中運行上述示例代碼, 會發現部分代碼的運行結果與注釋說明相同. 這是因為在 3.7 版本中, 常量折疊已經從窺孔優化器遷移至新的 AST 優化器, 后者可以以更高的一致性來執行優化. (由 Eugene Toder 和 INADA Naoki 在 bpo-29469 和 bpo-11549 中貢獻.)

(譯: 但是在最新的 3.8 版本中, 結果又變回去了. 雖然 3.8 版本和 3.7 版本一樣, 都是使用 AST 優化器. 目前不確定官方對 3.8 版本的 AST 做了什么調整.)

好啦!今天的分享到這里就結束了,希望大家持續關注馬哥教育官網,每天都會有大量優質內容與大家分享!版權聲明:轉載文章來自公開網絡,版權歸作者本人所有,推送文章除非無法確認,我們都會注明作者和來源。如果出處有誤或侵犯到原作者權益,請與我們聯系刪除或授權事宜。

相關新聞

歷經多年發展,已成為國內好評如潮的Linux云計算運維、SRE、Devops、網絡安全、云原生、Go、Python開發專業人才培訓機構!

    1. 主站蜘蛛池模板: 凤山县| 余姚市| 新竹县| 安乡县| 阿瓦提县| 洪湖市| 淳化县| 大埔区| 昌吉市| 深水埗区| 旬邑县| 安丘市| 三河市| 龙陵县| 大丰市| 荔波县| 始兴县| 龙海市| 资阳市| 亳州市| 罗甸县| 德兴市| 共和县| 托里县| 丰台区| 宁都县| 太湖县| 紫金县| 娄底市| 弥渡县| 建水县| 民丰县| 广汉市| 元阳县| 福鼎市| 乳源| 仙桃市| 贵南县| 桐庐县| 临海市| 远安县|