python的記憶體機制和深淺copy

2021-10-04 08:48:32 字數 3085 閱讀 4253

名詞解釋:

**塊: 乙個函式、乙個類『乙個模組、乙個檔案等都是**塊,總之就是乙個塊結構

**塊的快取機制:

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 記憶體機制的理解!噗,一下慌了,只想起來堆,棧,還有全域性靜態,面試官笑了給我簡單講了一下還。回去之後趕緊仔細查...