python中變量的賦值
- python中所有的數據都是對象,所有的變量都是對象的引用
- python對數字、字符串(簡單的字符串)和布爾對象進行緩存,讓不同的變量賦相同值的這些對象,給的地址時緩存的地址。
- 總結:
a.給一個變量賦值的時候,賦的是數、字符串和布爾的時候,會在緩存區中看是否有這個值。
如果有直接將值對應的地址賦給變量。沒有就在緩存中開辟空間存儲數據,然后返回地址
b.給一個除數字、字符串和布爾的變量賦值時,就直接在內存中開辟空間存儲數據,然后返回地址 - 一個變量存了對象的地址,那么這個變量就是這個對象的引用
python內存管理機制
c的內存管理機制:手動malloc
java/oc/python : 擁有一套屬于自己的自動內存管理機制
python通過垃圾回收機制來對內存進行管理--不定時對程序中的對象進行檢測,看是否需要回收(將內存釋放)。看是否需要回收-就看對象的引用計數是否為0,
為0就回收。引用計數: python中每個對象在創建的時候就會有一個屬性叫引用計數,其對應的值就是0。當對象被引用一次,其引用計數加1。當對象的引用減少一個,其引用計數減1
垃圾回收機制
- 垃圾回收機制并不是一旦產生引用計數為1的對象就馬上回收,而是不定時的對整個程序中的所有對象進行檢測,檢測的時候引用計數為0才回收
- 在當前程序所有對象引用計數變化的次數達到閾值的時候,才會對對象進行檢測
循環引用
- 循環引用利用python的垃圾回收機制,能夠自動解決因為循環引用而導致內存泄漏問題
- 檢測的時候如果對象(object_i)的引用計數不是0,就備份引用計數值,去找到引用這個當前對象的對象(object_j),然后將object_j的引用計數count_j減1。如果count_j減1的值是0,那么count_i的值就減1;如果減完后count_i的值也是0,那么object_i就會銷毀
- 案例
from sys import getrefcount #查看對象的引用次數
import gc
# 循環引用問題
l1 = []
l2 = []
l1.append(l2)
l2.append(l1)
l3 = l1
# del l1
# del l2
a = int(1)
object2 = [12,122,3]
object3 = object2
# 獲取垃圾回收臨界值
print(gc.get_threshold())
# 函數本身會對查看的對象進行一次引用
print(getrefcount(a),getrefcount(object2))
result:
(700, 10, 10)
108 3
循環引用.png