91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python變量的引用以及在底層存儲原理是怎樣的

發布時間:2021-09-24 16:07:34 來源:億速云 閱讀:192 作者:柒染 欄目:開發技術

本篇文章給大家分享的是有關python變量的引用以及在底層存儲原理是怎樣的,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

Python的變量,簡單來說有數值型,布爾型,字符串類型,列表,元組,字典等6大類。那么不同變量類型在底層是如何存儲的,關系到變量的引用,能否正確的掌握變量的相關操作

下面v1,v2的值分別是多少?為什么?

v1 =3
v2=v1
print("v2:",v2)
v1 += 2
print("v1:",v1)
print("v2:",v2)

#下面l2的值又是多少?為什么?

l1 = [1,2,3]
l2 =l1
print(l2)
l1.append(4)
print(l2)

1.變量的引用的底層原理

v1 =3
v2=v1            
print("v2:",v2)
v1 += 2          
print("v1:",v1)  
print("v2:",v2)   #v1的值變化了,為什么v2的值沒有跟著變化呢?
'''

執行結果如下:

v1: 5
v2: 3
'''

l1 = [1,2,3]
l2 =l1
print(l2)
l1.append(4)
print(l2)    #l1的值變化了,但是為什么l2的值也跟著變化了。
'''

執行結果如下:

[1, 2, 3]
[1, 2, 3, 4]

'''

要點分析:

  • 可變對象和不可變對象:不可變對象包括intfloatstringtuple等。可變對象包括list,dict,自定義類的實例等。

  • python中通過= 復制的變量,都是同時即把變量的值,也把變量在內存中的地址復制也過去了。即=復制過的變量不僅內存地址一樣,變量的值也一樣。但是需要注意的是:對于不可變類型(如int)的變量,如果要更改變量的值,則會創建一個新值,并且給這個新值分配一個新的內存地址,然后把變量指向這個新值的內存地址上,而舊值如果沒有被引用就等待垃圾回收。如果是可變類型變量。如果修改變量的值,則可以直接修改變量的值,變量的引用地址不會變。

不可變類型:變量賦值 a=5 后再賦值 a=10,這里實際是新生成一個 int 值對象 10,再讓 a 指向它,而 5 被丟棄,不是改變a的值,相當于新生成了a。

可變類型:變量賦值 la=[1,2,3,4] 后再賦值 la[2]=5 則是將 list la 的第三個元素值更改,本身la沒有動,只是其內部的一部分值被修改了。

  • 本質是因為不可變對象一旦新建后,系統就會根據他的大小給他分配固定死的內存,所以不允許修改,只修改值只能申請新的內存和地址。而可變對象,他的內存大小可以隨著值的變化而自動擴容    

代碼分析演示:

因為變量在內存中新建時,系統都會給他分配一個地址,然后通過地址去查找或引用他的值。  Python的所有變量其實都是指向內存中的對象的一個指針,都是值的引用

代碼演示1:

v1 =3
v2=v1
print("v1在內存的地址:%d,v2在內存中地址:%d"%(id(v1),id(v2)))
v1 += 2
print("v1在內存的地址:%d,v2在內存中地址:%d"%(id(v1),id(v2)))
print("v1:",v1)
print("v2:",v2)
========================================================
v1在內存的地址:1747378992,v2在內存中地址:1747378992
v1在內存的地址:1747379024,v2在內存中地址:1747378992
v1: 5
v2: 3
'''

因為:v1,v2都是int,為不可變對象,所以一旦修改他們的值,包扣加減乘除賦值等操作,系統會在內存中給他們重新創建一個。
然后再把這個變量綁定(通過地址引用)到這個值上,所以v1 +=2后,他在內存中的地址變了。而v2依舊引用的是之前的地址,所以v2的值
沒有更新。
'''

代碼演示2:

l1 = [1,2,3]
l2 =l1
print("l1在內存的地址:%d,l2在內存中地址:%d"%(id(l1),id(l2)))
print(l2)
print("l1在內存的地址:%d,l2在內存中地址:%d"%(id(l1),id(l2)))
l1.append(4)
print(l2)
print("l1在內存的地址:%d"%(id(l1)))
=======================================================
l1在內存的地址:37345880,l2在內存中地址:37345880
[1, 2, 3]
l1在內存的地址:37345880,l2在內存中地址:37345880
[1, 2, 3, 4]
l1在內存的地址:37345880

對于可變對象如列表,l1,l2,當修改他們的值時,系統會自動在原地址上給他們擴容內存,所以不用修改地址。

代碼演示3:同理字符串等不可變的變量引用效果也一樣。

str1 ='hahhahah'
str2 = str1
str1 += "123"
print(str1,str2)
hahhahah223 hahhahah

2.變量的分類

可變類型與不可變類型

可變類型,值可以改變:

  • 列表 list

  • 字典 dict

不可變類型,值不可以改變:

  • 數值類型 int, long, bool, float

  • 字符串 str

  • 元組 tuple

以上就是python變量的引用以及在底層存儲原理是怎樣的,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

中山市| 宿州市| 巫溪县| 原平市| 丘北县| 漯河市| 纳雍县| 黄冈市| 和田市| 宁安市| 洪雅县| 石河子市| 昌都县| 黎川县| 永宁县| 汪清县| 连平县| 西畴县| 汶川县| 清新县| 增城市| 恩平市| 景德镇市| 沁阳市| 乌兰浩特市| 苏尼特左旗| 临沭县| 扎鲁特旗| 麻阳| 高唐县| 石嘴山市| 镇雄县| 扎兰屯市| 改则县| 兴隆县| 沙坪坝区| 肥乡县| 龙川县| 湄潭县| 文山县| 民和|