每乙個程式語言的背後都有自己獨特的記憶體模型支援,比如最經典的c語言,乙個int型別佔8位元組。那麼在python中不區分資料型別,定義乙個變數其在內存在占用多少位元組呢?python中資料的運算其記憶體是如何變化的呢?
python一切資料皆為物件,python中的物件分成兩類:可變物件和不可變物件。所謂可變物件是指,物件的內容可變,而不可變物件是指物件內容不可變。
不可變(immutable):數值(int、float)、字串(string)、元組(tuple)
根據物件的分類,可以將資料型別也做乙個分類,
當對可變和不可變物件運算時會記憶體中會發生什麼事情呢?對比來看
不可變資料型別:
python對於資料的特殊處理
小整數
python為了優化速度,避免為整數頻繁申請和銷毀記憶體空間,使用了小整數物件池。
對小整數的定義是 [-5, 256] 這些整數物件是提前建立好的,不會被垃圾**。
a = 100b = 100
print(id(a))
print(id(b))
-------------------------
94125443429088
94125443429088
a = 200大整數大整數池: 只儲存包含標準字元(數字、字母、下劃線)的字串,不包含特殊字元的字串 。b = 200
print a
isb
-----------------true
a = 300
b = 300
print a isb
-----------------false
python為了避免建立大整數浪費的記憶體空間和時間,將建立過的大整數加入大整數池。
python中大整數池,
預設大整數池裡面為空,每乙個py程式都有乙個大整數池。使用大整數時如果大整數池裡不存在該整數的話,會新建乙個大整數物件。下次使用大整數時直接使用大整數池裡的物件,而不是建立新的物件
a = '其他資料型別12345
'b = '
12345
'print id(a)
print id(b)
-----------------------------
140139908067808
140139908067808
print a isb
-----------------------------true
c 之記憶體模型
c 程式在執行時,將記憶體大方向劃分為4個區域 區 存放函式體的二進位制 由作業系統進行管理 你寫的 都轉化成二進位制 全域性區 存放全域性變數和靜態變數以及常量 棧區 由編譯器自動分配和釋放,存放函式的引數值,區域性變數等 堆區 由程式設計師分配和釋放,若程式設計師不釋放,程式結束時由作業系統 記...
面試之記憶體模型
2.記憶體模型中的可見性,原則性,有序性 原子性 多執行緒情況下 原子性是指乙個操作是不可中斷的。即使是在多個執行緒一起執行的時候,乙個操作一旦開始,就不會被其他執行緒干擾。用i 來做為舉例,需要read,load,use,等等的操作,單個操作是原子性的,但是對應整個操作i 來說是不能保證原子性的,...
C 之記憶體模型 記憶體區域
2.malloc calloc realloc底層實現原理 2.2 calloc底層實現原理 2.3 realloc底層實現原理 2.4 分配虛擬記憶體的細節 2.5 free函式實現原理 3.new delete底層實現 4.相關面試題 3.應用 1 棧上的分配極為簡單,移動一下棧指標而已。2 棧...