名詞解釋:
**塊: 乙個函式、乙個類『乙個模組、乙個檔案等都是**塊,總之就是乙個塊結構
**塊的快取機制:
1)前提:同乙個**塊
2)機制:在執行同乙個**塊時,如果初始化乙個新的物件時,其值已經在記憶體中存在(以字典或者其他方式管理),則重用這個值。
3)具體:
int(float):任何數字在同一**塊下都會重用。
bool:true和false在字典中會以1、0的方式存在,並且復用。
str: 就是短的會重用,或者稍長一點,用*1的方法賦值會重用。
小資料池:
1)前提條件:不同**塊。
2)機制:
對於數字,python自動在記憶體中快取-5~256的數字,然後使用這些值的時候復用這些值。
對於字串,python會將符合一定規則的字串存在字串駐留池中。使用的時候復用它們
3)具體:
int :對於數字,python自動在記憶體中快取-5~256的數字,然後使用這些值的時候復用這些值。
str:1,字串的長度為0或者1,預設都採用了駐留機制(小資料池)
2,字串的長度》1,且只含有大小寫字母,數字,下劃線時,才會預設駐留。
3.1 乘數為1時:僅含大小寫字母,數字,下劃線,預設駐留含其他字元,長度<=1,預設駐留。含其他字元,長度》1,預設駐留。
3.2 乘數》=2時:僅含大小寫字母,數字,下劃線,總長度<=20,預設駐留。
##### 總的來說,還是較的字串才會採用駐留機制
指定駐留:
可以自定義駐留字串:
from sys import intern
a = intern(『hello!@』*20)
b = intern(『hello!@』*20)
print(a is b)
#指定駐留是你可以指定任意的字串加入到小資料池中,讓其只在記憶體中建立乙個物件,多個變數都是指向這乙個字串。
總結:如果在同一**塊下,則採用同一**塊下的換快取機制。
如果是不同**塊,則採用小資料池的駐留機制。
首先了解可變物件和不可變物件。
不可變物件: 一旦建立就不可修改,包括字串,元組,數字
可變物件: 可以修改內容的物件,包括列表、字典。
print("1:")
a = 2
b = a
print(id(a))
print(id(b))
print("2:")
a = 3
print(id(a))
print(id(b))
輸出:1: 140713763381680
140713763381680
2: 140713763381712
140713763381680
la = [1, 2, 3, 4, 5]
lb = la
print("1:")
print(id(la))
print(id(lb))
print(la)
print(lb)
#改變變數指向記憶體中的內容。
la[0] = 0
print("2:")
print(id(la))
print(id(lb))
print(la)
print(lb)
輸出:***1***:
2088964757640
2088964757640
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
***2****:
2088964757640
2088964757640
[0, 2, 3, 4, 5]
[0, 2, 3, 4, 5]
比如對列表la,lb(其中lb使用lb=la.copy()得到)而言,id(la)和id(lb)不同,而id(la[0]), id(la[1]), id(la[2])…和id(lb[0]), id(lb[1]), id(lb[2])…的記憶體位址相同
如果la[0]是不可變內容比如數字,改變la[0]的值,則對lb[0]不會產生影響。
如果la[1]是可變內容比如列表,刪除la[1]中的乙個元素,則lb[1]會有相同的變化,因為他們指向同乙個記憶體嘛,當然會同時改變了。
例子:
la = [1, 2, [3, 4, 5], "abcd"]
lb = la.copy()
print("***1***:")
print(la)
print(lb)
print("***2***:")
la[0] = 0
la[3] += "123"
print(la)
print(lb)
輸出: ***1***:
[1, 2, [3, 4, 5], 'abcd']
[1, 2, [3, 4, 5], 'abcd']
***2***:
[0, 2, [3, 4, 5, 0], 'abcd123']
[1, 2, [3, 4, 5, 0], 'abcd']
例子:
import copy
la = [1, 2, [3, 4, 5], "abcd"]
lb = copy.deepcopy(la)
print("***1***:")
print(la)
print(lb)
print("***2***:")
la[0] = 0
la[3] += "123"
print(la)
print(lb)
輸出: ***1***:
[1, 2, [3, 4, 5], 'abcd']
[1, 2, [3, 4, 5], 'abcd']
***2***:
[0, 2, [3, 4, 5, 0], 'abcd123']
[1, 2, [3, 4, 5], 'abcd']
補充:切片可以用於序列,即元組,列表,字串(不能用於字典)。切片賦值相當於淺copy。
字典可以使用深淺copy,但不能用切片實現
PYTHON 記憶體機制
初學python時,執行python程式時,我們大部分只關注運算的結果的正確性,很少會去想當python源 執行在python直譯器中,是怎樣執行的?計算機執行乙個程式 程式 軟體的執行 核心機制 因為所有的資源都是有限的,包括硬體資源,如果想要在有限的硬體資源上,執行盡可能多的軟體,需要有效的利用...
c 記憶體機制
首先,來談談c 的5個儲存區 1.棧 是分配給函式區域性變數的儲存單元,函式結束後,該變數的儲存單元自動釋放,效率高,分配的空間有限。2.堆 由new建立,由delete釋放的動態記憶體單元。如果使用者不釋放該記憶體,程式結束時,系統會自動 3.自由儲存區 由malloc建立,由free釋放的動態記...
C 記憶體機制
今天面試一頭霧水,學習c 的時候沒怎麼了解c 的記憶體機制,教科書上竟然沒有!what?老師上課只是提了一下,沒有說的很細,而且時間過去了好長時間,今天面試的時候面試官問我 說一下你對c 記憶體機制的理解!噗,一下慌了,只想起來堆,棧,還有全域性靜態,面試官笑了給我簡單講了一下還。回去之後趕緊仔細查...