Python中小整數對象池和大整數對象池


1. 小整數對象池

整數在程序中的使用非常廣泛,Python為了優化速度,使用了小整數對象池, 避免為整數頻繁申請和銷毀內存空間。

Python 對小整數的定義是 [-5, 256] 這些整數對象是提前建立好的,不會被垃圾回收。在一個 Python 的程序中,無論這個整數處於LEGB中的哪個位置,

所有位於這個范圍內的整數使用的都是同一個對象。同理,單個字母也是這樣的。

In [1]: a=-5

In [2]: b=-5 In [3]: a is b Out[3]: True In [4]: a=256 In [5]: b=256 In [6]: a is b Out[6]: True In [7]: a=1000 In [8]: b=1000 In [9]: a is b Out[9]: False
intern機制處理空格一個單詞的復用機會大,所以創建一次,有空格創建多次,但是字符串長度大於20,就不是創建一次了。
In [13]: a="abc" In [14]: b="abc" In [15]: a is b Out[15]: True In [16]: a="helloworld" In [17]: b="helloworld" In [18]: a is b Out[18]: True In [19]: a="hello world" In [20]: b="hello world" In [21]: a is b Out[21]: False

 

s1 = "abcd" s2 = "abcd" print(s1 is s2) s1 = "a" * 20 s2 = "a" * 20 print(s1 is s2) s1 = "a" * 21 s2 = "a" * 21 print(s1 is s2) s1 = "ab" * 10 s2 = "ab" * 10 print(s1 is s2) s1 = "ab" * 11 s2 = "ab" * 11 print(s1 is s2) # True # True # False # True # False

 

2.大整數對象池。說明:終端是每次執行一次,所以每次的大整數都重新創建,而在pycharm中,每次運行是所有代碼都加載都內存中,屬於一個整體,所以

 這個時候會有一個大整數對象池,即處於一個代碼塊的大整數是同一個對象。c1 和d1 處於一個代碼塊,而c1.b和c2.b分別有自己的代碼塊,所以不相等。

C1.b is C2.b
In [22]: a=1000

In [23]: b=1000 In [24]: a is b Out[24]: False In [25]: a=-1888 In [26]: b=-1888 In [27]: a is b Out[27]: False In [28]: 
c1 = 1000
d1 = 1000
print(c1 is d1) # True

class C1(object): a = 100 b = 100 c = 1000 d = 1000 class C2(object): a = 100 b = 1000 print(C1.a is C1.b) # True print(C1.a is C2.a) # True print(C1.c is C1.d) # True print(C1.b is C2.b) # False


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM