Python內存相關

Python內存相關

示例一:python

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(垃圾回收機制)釋放掉。

示例三:app

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

示例四:code

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),對其內部的元素進行操做時,將不會從新開闢內存空間,對整個變量進行賦值時,將會開闢新的內存空間。對象

小數據池

v1 = 123
v2 = 123
print("int:", id(v1))
print(id(v2))

v1 = "dogfa"
v2 = "dogfa"
print("str:", id(v1))
print(id(v2))

理論上v1和v2的內存地址是不同的,可是結果是否真的如此嗎?如下是打印輸出結果。blog

從打印結果咱們 能夠看出內存地址是徹底一致的,那麼是否意味着咱們以前所認爲的全都是錯誤的?其實並非的。內存

由於在Python當中有一個小數據池,你能夠理解爲是一個容器,裏面存放了int類型和str類型的數據的存儲規則。class

一、int類型的規則:它會把 -5 ~ 256 範圍內的數進行緩存,當你將這些整數賦值給變量時,它不會再次開闢新的內存空間,而是使用已經建立好的緩存對象。容器

二、str類型的規則:① 出現特殊字符時,內存地址不相等變量

​ ② 當字符超過20個以上時,內存地址不會相等

is 和 == 的區別

  1. is:對內存地址進行比較

    v1 = 123
    v2 = v1
    print(v1 is v2)      # True
    v1 = 321
    print(v1 is v2)      # False
  2. ==:對兩邊的值進行比較

    v1 = 6
    v2 = 6
    print(v1 == v2)  # True
相關文章
相關標籤/搜索