欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關(guān)于python變量的引用以及在底層存儲(chǔ)原理

 更新時(shí)間:2021年09月18日 11:46:47   作者:滌生手記  
Python的變量,簡(jiǎn)單來(lái)說(shuō)有數(shù)值型,布爾型,字符串類(lèi)型,列表,元組,字典等6大類(lèi)。那么不同變量類(lèi)型在底層是如何存儲(chǔ)的,關(guān)系到變量的引用,能否正確的掌握變量的相關(guān)操作?接下來(lái)小編就來(lái)為大家講解python變量的引用以及在底層存儲(chǔ)原理,需要的朋友可以參考一下

Python的變量,簡(jiǎn)單來(lái)說(shuō)有數(shù)值型,布爾型,字符串類(lèi)型,列表,元組,字典等6大類(lèi)。那么不同變量類(lèi)型在底層是如何存儲(chǔ)的,關(guān)系到變量的引用,能否正確的掌握變量的相關(guān)操作

下面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的值沒(méi)有跟著變化呢?
'''


執(zhí)行結(jié)果如下:

v1: 5
v2: 3
'''

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

執(zhí)行結(jié)果如下:

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

'''

要點(diǎn)分析:

  • 可變對(duì)象和不可變對(duì)象:不可變對(duì)象包括intfloat,string,tuple等??勺儗?duì)象包括list,dict,自定義類(lèi)的實(shí)例等。
  • python中通過(guò)= 復(fù)制的變量,都是同時(shí)即把變量的值,也把變量在內(nèi)存中的地址復(fù)制也過(guò)去了。即=復(fù)制過(guò)的變量不僅內(nèi)存地址一樣,變量的值也一樣。但是需要注意的是:對(duì)于不可變類(lèi)型(如int)的變量,如果要更改變量的值,則會(huì)創(chuàng)建一個(gè)新值,并且給這個(gè)新值分配一個(gè)新的內(nèi)存地址,然后把變量指向這個(gè)新值的內(nèi)存地址上,而舊值如果沒(méi)有被引用就等待垃圾回收。如果是可變類(lèi)型變量。如果修改變量的值,則可以直接修改變量的值,變量的引用地址不會(huì)變。

不可變類(lèi)型:變量賦值 a=5 后再賦值 a=10,這里實(shí)際是新生成一個(gè) int 值對(duì)象 10,再讓 a 指向它,而 5 被丟棄,不是改變a的值,相當(dāng)于新生成了a。

可變類(lèi)型:變量賦值 la=[1,2,3,4] 后再賦值 la[2]=5 則是將 list la 的第三個(gè)元素值更改,本身la沒(méi)有動(dòng),只是其內(nèi)部的一部分值被修改了。

  • 本質(zhì)是因?yàn)椴豢勺儗?duì)象一旦新建后,系統(tǒng)就會(huì)根據(jù)他的大小給他分配固定死的內(nèi)存,所以不允許修改,只修改值只能申請(qǐng)新的內(nèi)存和地址。而可變對(duì)象,他的內(nèi)存大小可以隨著值的變化而自動(dòng)擴(kuò)容    

代碼分析演示:

因?yàn)樽兞吭趦?nèi)存中新建時(shí),系統(tǒng)都會(huì)給他分配一個(gè)地址,然后通過(guò)地址去查找或引用他的值。  Python的所有變量其實(shí)都是指向內(nèi)存中的對(duì)象的一個(gè)指針,都是值的引用

代碼演示1:

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


因?yàn)椋?/strong>v1,v2都是int,為不可變對(duì)象,所以一旦修改他們的值,包扣加減乘除賦值等操作,系統(tǒng)會(huì)在內(nèi)存中給他們重新創(chuàng)建一個(gè)。
然后再把這個(gè)變量綁定(通過(guò)地址引用)到這個(gè)值上,所以v1 +=2后,他在內(nèi)存中的地址變了。而v2依舊引用的是之前的地址,所以v2的值
沒(méi)有更新。
'''

代碼演示2:

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

對(duì)于可變對(duì)象如列表,l1,l2,當(dāng)修改他們的值時(shí),系統(tǒng)會(huì)自動(dòng)在原地址上給他們擴(kuò)容內(nèi)存,所以不用修改地址。

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

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

2.變量的分類(lèi)

可變類(lèi)型與不可變類(lèi)型

可變類(lèi)型,值可以改變:

  • 列表 list
  • 字典 dict

不可變類(lèi)型,值不可以改變:

  • 數(shù)值類(lèi)型 int, long, bool, float
  • 字符串 str
  • 元組 tuple

到此這篇關(guān)于關(guān)于python變量的引用以及在底層存儲(chǔ)原理的文章就介紹到這了,更多相關(guān)python變量的引用以及在底層存儲(chǔ)原理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用python實(shí)現(xiàn)簡(jiǎn)單五子棋游戲

    使用python實(shí)現(xiàn)簡(jiǎn)單五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了使用python實(shí)現(xiàn)簡(jiǎn)單五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • Python中*args和**kwargs的區(qū)別詳解

    Python中*args和**kwargs的區(qū)別詳解

    這篇文章主要介紹了Python中*args和**kwargs的區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • python網(wǎng)絡(luò)編程學(xué)習(xí)筆記(四):域名系統(tǒng)

    python網(wǎng)絡(luò)編程學(xué)習(xí)筆記(四):域名系統(tǒng)

    當(dāng)我們?cè)谏暇W(wǎng)的時(shí)候,通常輸入的是網(wǎng)址,其實(shí)這就是一個(gè)域名,而我們計(jì)算機(jī)網(wǎng)絡(luò)上的計(jì)算機(jī)彼此之間只能用IP地址才能相互識(shí)別
    2014-06-06
  • jupyter .ipynb轉(zhuǎn).py的實(shí)現(xiàn)操作

    jupyter .ipynb轉(zhuǎn).py的實(shí)現(xiàn)操作

    這篇文章主要介紹了jupyter .ipynb轉(zhuǎn).py的實(shí)現(xiàn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03
  • Python中的高級(jí)數(shù)據(jù)結(jié)構(gòu)詳解

    Python中的高級(jí)數(shù)據(jù)結(jié)構(gòu)詳解

    這篇文章主要介紹了Python中的高級(jí)數(shù)據(jù)結(jié)構(gòu)詳解,本文講解了Collection、Array、Heapq、Bisect、Weakref、Copy以及Pprint這些數(shù)據(jù)結(jié)構(gòu)的用法,需要的朋友可以參考下
    2015-03-03
  • 在Python開(kāi)發(fā)環(huán)境中調(diào)用ChatGPT模型詳細(xì)過(guò)程

    在Python開(kāi)發(fā)環(huán)境中調(diào)用ChatGPT模型詳細(xì)過(guò)程

    在開(kāi)發(fā)過(guò)程當(dāng)中時(shí)常需要使用 ChatGPT 來(lái)完成一些任務(wù),但總是使用網(wǎng)頁(yè)交互模式去 Web 端訪問(wèn) ChatGPT 是很麻煩的,這時(shí)候我們可以使用代碼來(lái)調(diào)用 ChatGPT 模型,本文將詳細(xì)介紹在 Python 開(kāi)發(fā)環(huán)境中調(diào)用 ChatGPT 模型過(guò)程,,需要的朋友可以參考下
    2023-05-05
  • python實(shí)現(xiàn)決策樹(shù)分類(lèi)算法

    python實(shí)現(xiàn)決策樹(shù)分類(lèi)算法

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)決策樹(shù)分類(lèi)算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • python使用torch隨機(jī)初始化參數(shù)

    python使用torch隨機(jī)初始化參數(shù)

    這篇文章主要介紹了python使用torch隨機(jī)初始化參數(shù),文章圍繞torch隨機(jī)初始化參數(shù)的相關(guān)資料展開(kāi)文章詳細(xì)內(nèi)容,具有一定的參考價(jià)值,需要的小伙伴可以參考一下,希望對(duì)你有所幫助
    2022-03-03
  • Python中Tkinter組件Frame的具體使用

    Python中Tkinter組件Frame的具體使用

    本文主要介紹了Python中Tkinter組件Frame的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • python生成word合同的實(shí)例方法

    python生成word合同的實(shí)例方法

    在本篇內(nèi)容里小編給大家分享的是一篇關(guān)于python生成word合同的實(shí)例方法相關(guān)內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。
    2021-01-01

最新評(píng)論