日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Python小整數對象池和字符串intern實例解析

瀏覽:206日期:2022-08-01 16:27:58

is用于判斷兩個對象是否為同一個對象,具體來說是兩個對象在內存中的位置是否相同。

python為了提高效率,節省內存,在實現上大量使用了緩沖池技術和字符串intern技術。

整數和字符串是不可變對象,也就意味著可以用來共享,如100個“python”字串變量可以共享一個“python”字符串對象,而不是創建100個“python”字符串。

小整數對象池

為了應對小整數的頻繁使用,python使用對小整數進行了緩存,默認范圍為[-5,256],在這個范圍內的所有整數被python完全地緩存,當有變量使用這些小整數時,增加對應小整數對象的引用即可。

>>> i = -5>>> j = -5>>> i is j # i和j是同一個對象True>>> i = 256>>> j = 256>>> i is j # i和j是同一個對象True>>> i = 257>>> j = 257>>> i is j # i和j是不同對象False

由上面的實例可以看到,當變量在[-5,256]之間時,兩個值相同的變量事實上會引用到同一個小整數對象上,也就是小整數對象池中的對象,而不會去創建兩個對象。而當變量超出了這個范圍,兩個值相同的變量也會各自創建整數對象,所以兩者對應的對象不同。

字符串intern

如果當前變量引用的字符串對象已經存在的話,直接增加對應字符串對象的引用,而不去創建新的字符串對象,這就是字符串intern機制。

>>> i = '12' >>> j = '12' >>> i is j True

在詳細探討字符串intern機制之前,先看一個奇怪的問題:

>>> i = '1 2' >>> j = '1 2' >>> i is j False

i = '1 2' j = '1 2' print(i is j)

輸出結果

True

上述代碼分開運行,結果為False,但是合在一起結果卻為True,也就是說分開運行的時候,i,j指向不同對象,而合在一起的時候i,j卻指向了相同對象。為了明白其中的緣由,需要簡單理解python的編譯機制。

編譯機制

在python中,萬物皆對象,包括代碼本身也是一種對象。python用code對象表示代碼,代碼編譯后產生code對象。通常一個作用域對應一個code對象。

i = '1 2'j = '1 2'print(i is j)def f(): pass

編譯結果

2 0 LOAD_CONST 0 (’1 2’)2 STORE_NAME 0 (i)

3 4 LOAD_CONST 0 (’1 2’)6 STORE_NAME 1 (j)

5 8 LOAD_CONST 1 (<code object f at 0x00000200F257CF60, file 'small_int.py', line 5>)10 LOAD_CONST 2 (’f’)12 MAKE_FUNCTION 014 STORE_NAME 2 (f)16 LOAD_CONST 3 (None)18 RETURN_VALUE

Disassembly of <code object f at 0x00000200F257CF60, file 'small_int.py', line 5>:6 0 LOAD_CONST 0 (None)2 RETURN_VALUE

上述代碼中編譯生成了兩個code對象,一個代表全局作用域,另一個代表函數f。

code對象保存了變量,常量(常量字面量)以及編譯結果。code對象用常量表來保存常量,考慮到一個常量可能出現多次,在一張表上保存一個常量多次太過于奢侈。所以code對象對每個常量只保存一次,在需要引用它的地方使用它在常量表的位置作為常量的表示。在上述編譯結果中可以看到,'1 2'這個字符串常量使用了兩次,編譯的代碼為'LOAD_CONST 0',這里的0就是'1 2'在常量表當中的位置。

由于編譯的這個特性,在同一個code對象中的變量,如果它們引用了同一個常量,那么無論這個常量有沒有緩沖機制,它們引用的都是同一個對象。

a = '12'b = '12'c = '1 2'd = '1 2'e = 257f = 257g = 2424234234234234h = 2424234234234234print(a is b, c is d, e is f, g is h)

輸出結果

True True True True

這個例子說明,在同一個code對象當中,常量(字面量)僅一份,這與緩沖機制無關,是編譯特性。所以對于上述那個奇怪的問題就可以解釋了,當i,j在同一個code對象(同一個作用域)中引用常量'1 2',它們引用的都是同一個對象。而當在python命令行中分開執行時,對于每一條語句,都是一個單獨的code對象,這時起作用的是字符串intern機制,上述運行結果說明,字符串intern機制對'12'進行了intern,而對'1 2'沒有進行intern。

編譯機制與小整數對象池對比

i = 257j = 257a = i - 1b = i - 1c = i + 1d = i + 1print(i is j, a is b, c is d)

輸出結果

True True False

i和j引用同一個常量,這是編譯機制,所以i與j指向同一個整數對象,后面a和b雖然相等,但不引用常量,此時啟用小整數對象池,a,b都等于256,在對象池中,所以a,b引用同一個對象,后面c,d不在對象池中,所以兩者對象不同。

這里有一點需要注意,沒有變量參與的運算會被編譯器直接優化成對應的常量,進而保存進常量表中。

字符串intern機制與字符緩沖池在編譯過程中,字符串intern機制將所有的變量名進行intern,但對常量進行的intern有一點特殊的限制。能夠intern的常量必須只包含[a-zA-Z0-9_],即字母數字加下劃線,如果含有其他字符,就不會intern。在運行過程中,通過計算得到的字符串不會intern。

字符串有一個和小整數對象池相似的字符緩沖池,用于在運行過程中緩存單個字符,所以計算得到的字符串雖然不會intern,但如果是單個字符,就會使用到字符緩沖池。

k = 'bbb'a = k[0]b = k[0]c = k[1:]d = k[1:]print(a, d)print(a is b, c is d)

輸出結果

b bb True False

可以看到,a和b確實指向同一個對象,而c和d指向不同對象,這就是字符緩沖池。

編譯機制與字符串intern對比

i = '1 2'j = '12'k = '__fjdslfjaskfas'ii = '1 2'jj = '12'kk = '__fjdslfjaskfas'def f(): a = '1 2' b = '12' c = '__fjdslfjaskfas' return a is i, b is j, c is kprint('Code:', i is ii, j is jj, k is kk)print(f'intern: {f()}')

輸出結果

Code: True True True intern: (False, True, True)

i包含空格,包含空格的常量不會被intern,而其他兩個常量不包含其他字符,所以會被intern。

總結

1. python代碼被編譯成code對象,通常一個code對象對應于一個作用域,作用域中重復出現的變量名以及常量在code中只保存一次。

2. 字符串intern機制主要作用于編譯過程,在編譯收集完變量和常量時,對變量和常量進行intern,而后構建一個code對象。

3. 字符串intern對常量的intern有限制,能夠intern的常量必須只包含[a-zA-Z0-9_],即字母數字加下劃線,如果含有其他字符,就不會intern。

4. 小整數對象池和字符緩沖池都是作用于運行過程中,python緩存小的整數和字符,當有變量使用這些對象時,不用額外創建對象。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品亚洲产品| 成人看片网站| 日韩视频一区| 国产综合欧美| 日韩一区三区| 欧美日韩水蜜桃| 国产精品调教| 国产精品欧美日韩一区| 国产精品一区二区三区av| 国产精品一区二区三区www| 国产精品www.| 福利精品在线| 中文字幕在线免费观看视频| www.51av欧美视频| 群体交乱之放荡娇妻一区二区| 97精品国产| 99久久亚洲精品蜜臀| 91国语精品自产拍| 日韩中文字幕91| 日韩精品福利一区二区三区| 国产三级一区| 国产精品第十页| 三上亚洲一区二区| 天堂网av成人| 一区二区视频欧美| 天堂精品久久久久| 欧美aaaaaa午夜精品| 日韩高清欧美| 亚洲精品电影| 91成人精品观看| 福利精品一区| 国产精品嫩草99av在线| 日韩精品1区2区3区| 日韩成人精品一区二区| 亚州av乱码久久精品蜜桃| 蜜臀久久99精品久久久画质超高清| 日韩午夜免费| 国产亚洲一卡2卡3卡4卡新区| 福利一区在线| 一区免费视频| 日韩高清不卡在线| 精品亚洲成人| 亚洲一区日韩在线| 国产欧美日韩视频在线| 日韩欧美看国产| 免费成人在线视频观看| 国产成人免费av一区二区午夜| 91精品一区国产高清在线gif| 视频一区在线播放| 久久三级中文| 日韩午夜av| 日韩不卡手机在线v区| 国产a亚洲精品| 国产精品毛片在线看| 国产精品99久久免费观看| 亚洲精品.com| 欧美欧美黄在线二区| 欧洲精品一区二区三区| 天堂俺去俺来也www久久婷婷| 国产在视频一区二区三区吞精| 午夜影院欧美| 欧美精品二区| 国产一卡不卡| 亚洲激情中文在线| 国产精品久久免费视频| 女主播福利一区| 日本99精品| 欧美粗暴jizz性欧美20| 久久国内精品自在自线400部| 福利一区二区三区视频在线观看| 亚洲在线电影| 国产精品精品| 久久精品99国产精品| 91超碰国产精品| 麻豆精品久久久| 亚洲精一区二区三区| 日本美女一区| 欧美偷窥清纯综合图区| 婷婷激情图片久久| 国产99久久| 精品国产亚洲一区二区在线观看| 久久亚洲国产| 精品伊人久久久| 亚洲免费一区三区| 亚洲福利专区| 国产videos久久| 日本不卡高清视频| 午夜日韩av| 久久精品官网| 精品一区二区三区视频在线播放| 亚洲制服一区| 亚洲精品1区2区| 日韩精品欧美| 精品三级在线| 欧美午夜三级| 中文字幕日本一区二区| 色爱av综合网| 精品久久电影| 国产日韩一区二区三区在线 | 蜜桃精品视频| 日韩高清三区| 亚洲一级大片| 日本大胆欧美人术艺术动态| 亚洲国产专区| 免费在线小视频| 高清久久一区| 卡一卡二国产精品| 国产精品亚洲四区在线观看| 日本不卡一区二区三区| 最近国产精品视频| 美美哒免费高清在线观看视频一区二区| 欧美~级网站不卡| 久久久久中文| 精品在线91| 99在线精品免费视频九九视 | 亚洲精品88| 欧美一级鲁丝片| 日韩成人高清| 久久一级电影| 天堂资源在线亚洲| 99精品综合| 国产99精品一区| 国产精品88久久久久久| 午夜国产精品视频| 99pao成人国产永久免费视频| 国产精品88久久久久久| av不卡在线| 玖玖玖国产精品| 中文字幕日本一区二区| 中文字幕av一区二区三区人| 91久久久精品国产| 午夜av一区| 国产v综合v| 久久九九精品| 四虎4545www国产精品 | 亚洲2区在线| 欧美在线观看天堂一区二区三区| 亚洲欧美日本国产专区一区| 免费在线欧美视频| 国产一区白浆| 日韩专区视频网站| 综合激情一区| 久久国产精品免费一区二区三区| 日本高清不卡一区二区三区视频| 久久精品卡一| 日韩欧美精品| 欧美日韩高清| 深夜视频一区二区| 日韩在线不卡| 日韩视频在线一区二区三区 | 欧美午夜不卡| 一区二区三区国产在线| 一区二区精品| 欧美黄色一区二区| 亚洲va久久久噜噜噜久久| 在线精品视频一区| 亚洲一区二区动漫| 91精品日本| 久久麻豆精品| 在线观看一区| 69精品国产久热在线观看| 欧美日韩1区2区3区| 福利一区二区三区视频在线观看| 国产精品毛片久久| 亚洲一区国产一区| 综合色就爱涩涩涩综合婷婷| 欧美国产另类| 91亚洲自偷观看高清| 欧美另类专区| 亚洲免费福利一区| 精品免费在线| se01亚洲视频 | 激情黄产视频在线免费观看| 五月激情久久| 中文字幕亚洲影视| 国产精品亚洲一区二区在线观看| www.九色在线| 欧美精品九九| 欧美精品二区| 亚洲欧洲一区二区天堂久久| 天堂成人国产精品一区| 老牛国内精品亚洲成av人片| 成人精品动漫一区二区三区| 99久久精品费精品国产| 一区二区三区午夜视频| 国产91欧美| 亚洲少妇在线| 精品国产网站| 亚洲大全视频| 精品亚洲a∨| 亚洲女同中文字幕| 国产精品久久免费视频| 国产中文在线播放| 午夜久久av| 日韩一区三区| 亚洲精品少妇| 99精品网站| 日韩av中文字幕一区二区三区| 欧美天堂视频| 亚洲色图网站|