python的記憶體管理

Uzizi發表於2018-05-21

1、==與is

  • is比較的是兩個物件的id值是否相等,也就是比較倆物件是否為同一個例項物件,是否指向同一個記憶體地址。
  • ==比較的是兩個物件的內容是否相等,預設會呼叫物件的_eq_()方法。

片段一:

>>> a = 256
>>> b = 256
>>> a is b
True
>>>

片段二:

>>> a = 257
>>> b = 257
>>> a is b
False
>>>

處於效能的考慮,python內部做了很多的優化工作,對於整數物件,Python把一些頻繁使用的整數物件快取起來,儲存到一個叫small_ints的連結串列中,在Python的整個生命週期內,任何需要引用這些整數物件的地方,都不再重新建立新的物件,而是直接引用快取中的物件。Python把這些可能頻繁使用的整數物件規定在範圍[-5, 256]之間的小物件放在small_ints中,但凡是需要用些小整數時,就從這裡面取,不再去臨時建立新的物件。因為257不再小整數範圍內,因此儘管a和b的值是一樣,但是他們在Python內部卻是以兩個獨立的物件存在的,各自為政,互不干涉。

>>> c = 257
>>> def foo():
...     a = 257
...     b = 257
...     print a is b
...     print a is c
... 
>>> foo()
True
False

python程式有程式碼塊構成,程式碼塊是程式的最小基本單位,一個模組檔案、一個函式體、一個類、互動式命令中的單行程式碼都稱為一個程式碼塊。c = 257為一個程式碼塊,函式foo為另一塊程式碼塊,python每部為了將效能進一步的提高,凡是一個程式碼塊建立的證照物件,如果存在一個值與其相同的物件於該程式碼塊中,直接引用,否則建立一個新的物件。Python出於對效能的考慮,但凡是不可變物件,在同一個程式碼塊中的物件,只有是值相同的物件,就不會重複建立,而是直接引用已經存在的物件。 整數和字串物件遵守以上原則。

2、總結

  • 小整數物件[-5,256]是全域性直譯器範圍內被重複使用,永遠不會被GC回收。
  • 同一個程式碼塊中的不可變物件,只要值是相等的就不會重複建立新的物件。

相關文章