Python内存相关
生活随笔
收集整理的這篇文章主要介紹了
Python内存相关
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Python內存相關
示例一:
v1 = [1, 2, 3] v2 = [1, 2 ,3]v1 = 123 v2 = 123v1 = "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 v2.append(4) 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] v.append(4) print(v) # [1, 2, 3, 4] print(lst) # [11, 22, [1, 2, 3, 4]] # lst 中的v 實際上存放的是指向的內存地址v = [1, 2, 3] lst = [11, 22, v] lst[2].append(4) 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),對其內部的元素進行操作時,將不會重新開辟內存空間,對整個變量進行賦值時,將會開辟新的內存空間。小數據池
-------------------------------------------------------------------- 注:如果你對python感興趣,我這有個學習Python基地,里面有很多學習資料,感興趣的+Q群:895817687 -------------------------------------------------------------------- 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 范圍內的數進行緩存,當你將這些整數賦值給變量時,它不會再次開辟新的內存空間,而是使用已經創建好的緩存對象。
2、str類型的規則:① 出現特殊字符時,內存地址不相等
? ② 當字符超過20個以上時,內存地址不會相等
is 和 == 的區別
1:is:對內存地址進行比較
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内存相关的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python运算符和编码
- 下一篇: Python基本数据类型(二)