Python記憶體相關

2022-06-21 08:12:08 字數 2628 閱讀 1890

示例一:

v1 = [1, 2, 3]

v2 = [1, 2 ,3]

v1 = 123

v2 = 123

v1 = "dogfa"

v2 = "dogfa"

# 雖然v1 和v2 的值相同,但是由於v1和v2 在記憶體中分別開闢了兩塊不同的空間,所以理論上v1的記憶體位址不等於v2的記憶體位址 (在python中有不同變化,下面會介紹)

示例二:

v1 = [1, 2, 3]

v1 = [4, 5, 6]

# v1最開始指向的記憶體位址是[1, 2, 3],但是由於對v1進行了重新賦值,所以v1重新指向了記憶體位址中的[4, 5, 6],這個時候原來v1 指向的記憶體位址中的[1, 2, 3]由於沒有變數接收,將會被python中的gc(垃圾**機制)釋放掉。

示例三:

v1 = [1, 2, 3]

v2 = v1

print(v1) # [1, 2, 3, 4]

print(v2) # [1, 2, 3, 4]

# v1 的記憶體位址指向了[1, 2, 3],v2 = v1 表示將v1 的記憶體位址賦值給了v2, 也就意味著v2的記憶體位址也指向著[1, 2, 3],無論對v1 中的元素還是對v2 中的元素進行改變,都將互相影響。

v1 = [1, 2, 3]

v2 = v1

v1 = 123

print(v1) # 123

print(v2) # [1, 2, 3]

# 首先v1 和v2 指向了同乙個記憶體位址,但是後來對v1 進行了重新賦值,v1所指向的記憶體位址發生了改變,而v2所指向的記憶體位址並沒有發生改變,還是原先v1 所指向的記憶體位址,所以print(v1)將輸出 「123」, print(v2)將輸出[1, 2, 3]

v1 = "dogfa"

v2 = v1

v1 = "oldniu"

print(v1) # oldniu

print(v2) # dogfa

示例四:

v = [1, 2, 3]

lst = [11, 22, v]

print(v) # [1, 2, 3, 4]

print(lst) # [11, 22, [1, 2, 3, 4]]

# lst 中的v 實際上存放的是指向的記憶體位址

v = [1, 2, 3]

lst = [11, 22, v]

print(v) # [1, 2, 3, 4]

print(lst) # [11, 22, [1, 2, 3, 4]]

v = [1, 2, 3]

lst = [11, 22, v]

v = 4

print(v) # 4

print(lst) # [11, 22, [1, 2, 3]]

# v 的記憶體位址發生了改變,而lst中的v指向並沒有發生改變

v = [1, 2, 3]

lst = [11, 22, v]

lst[2] = 33

print(v) # [1, 2, 3]

print(lst) # [11, 22, 33]

結論:當變數屬於不可變型別時(str,int,tuple),對其重新賦值,將會開闢新的記憶體空間。當變數屬於可變型別時(list,dict,set),對其內部的元素進行操作時,將不會重新開闢記憶體空間,對整個變數進行賦值時,將會開闢新的記憶體空間。

v1 = 123

v2 = 123

print("int:", id(v1))

print(id(v2))

v1 = "dogfa"

v2 = "dogfa"

print("str:", id(v1))

print(id(v2))

理論上v1和v2的記憶體位址是不一樣的,但是結果是否真的如此嗎?以下是列印輸出結果。

從列印結果我們 可以看出記憶體位址是完全一致的,那麼是否意味著我們之前所認為的全都是錯誤的?其實並不是的。

因為在python當中有乙個小資料池,你可以理解為是乙個容器,裡面存放了int型別和str型別的資料的儲存規則。

1、int型別的規則:它會把 -5 ~ 256 範圍內的數進行快取,當你將這些整數賦值給變數時,它不會再次開闢新的記憶體空間,而是使用已經建立好的快取物件。

​ ② 當字元超過20個以上時,記憶體位址不會相等

v1 = 123

v2 = v1

print(v1 is v2) # true

v1 = 321

print(v1 is v2) # false

==:對兩邊的值進行比較

v1 = 6

v2 = 6

print(v1 == v2) # true

python 記憶體相關

1.proc pid status 可以檢視程序相關的詳細資訊,當記憶體異常時可檢視 參考 2.top p 程序號 實時檢視程序相關記憶體 3.記憶體除錯 參考 memory profiler檢視函式中各行 的記憶體增長 guppy檢視python物件占用的堆記憶體大小 4.檢視變數引用計數 imp...

python 記憶體相關

1.proc pid status 可以檢視程序相關的詳細資訊,當記憶體異常時可檢視 參考 2.top p 程序號 實時檢視程序相關記憶體 3.記憶體除錯 參考 memory profiler檢視函式中各行 的記憶體增長 guppy檢視python物件占用的堆記憶體大小 4.檢視變數引用計數 imp...

python 記憶體相關

v1 1,2,3 v2 1,2,3 不是同乙個記憶體位址,各自改變,與對方無關 v1 1,2,3 v1 1,2,3,4 不是同乙個記憶體位址,第乙個v1被閒置,等待被 v1 1,2,3 v2 v1 是同乙個記憶體位址,v2 指向 v1 的位址,v1 改變,v2 也會改變 練習題 v1 1,2,3 v...