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

Python中的變量賦值

 更新時間:2021年10月11日 11:27:14   作者:真的會了嗎  
這篇文章主要介紹了Python中的變量賦值,Python中的變量在使用中很流暢,可以不關注類型,任意賦值,對于開發(fā)來說效率得到了提升,但不了解其中的機理,往往也會犯一些小錯,讓開發(fā)進行的不那么流暢,本文就從語言設計和底層原理的角度,帶大家理解Python中的變量。

引言:

Python中的變量在使用中很流暢,可以不關注類型,任意賦值,對于開發(fā)來說效率得到了提升,但若不了解其中的機理,往往也會犯一些小錯,讓開發(fā)進行的不那么流暢,本文就是從語言設計和底層原理的角度,帶大家理解Python中的變量。

下面我們從一個簡單例子開始:

a = 3

當我們代碼中寫入a=3時到底發(fā)生了啥,從概念上來說,Python會執(zhí)行三個不同的步驟來完成這個請求:

  • 創(chuàng)建了一個對象來代表值3
  • 若是a尚未創(chuàng)建會創(chuàng)建一個變量a
  • 將變量a和新的對象3進行關聯,稱變量a為對象3的一個引用

上文提到的三個關鍵字,“對象”、“變量”、“引用”是Python中讓變量得以運作的關鍵,我們在下一小節(jié)細細道來。

1 變量、對象、引用

先從概念說起:

對象是分配的一塊內存,有足夠的空間去表示它們所代表的值。

變量是一個系統(tǒng)表的元素,擁有指向對象的連接的空間。

引用時自動形成的從變量到對象的指針。

接著上文中a=3的三個步驟,咱們增加一句代碼:

a = 3
b = a

下面通過一張圖表征了兩句話執(zhí)行的結果:

關于b=a引發(fā)的操作為b同樣也指向了3,建立了從變量b到對象3的引用,此部分實現了python的賦值操作。此部分引出了Python中的賦值操作的秘密,下面咱們先來看一下為什么Python中變量賦值時不用指定變量的類型呢,實際上從上面的概念中已經發(fā)現了一個重要定義:

>>> 類型屬于對象,而不是變量

為了理解對象類型是如何使用的,我們看一下對一個變量多次賦值的結果:

a = 3
a = 'wali'
a = 3.1415926

從表面上看,a開始是一個整數,接著變成一個字符串,最后變成一個浮點,對于學習過C語言的人來說,這個是無法理解的,但對于python來說,這是可以執(zhí)行的。看起來像是a的類型在連續(xù)改變,實際上我們理解了變量、引用、對象的概念以及“類型屬于對象,而不是變量”這些知識后,我們會發(fā)現,實際發(fā)生了如下的事情:

執(zhí)行中分別創(chuàng)建了整數類型的對象3,字符串的對象“wali”以及浮點數的對象3.14,變量a并不擁有這些類型,只是簡單的通過引用分別指向了三個對象。

進一步深入研究就會發(fā)現,從Python語言實現的角度來說,每個對象都包含了一個頭部信息,其中就標識了這個對象的類型。

此外,還有一個概念“引用計數器”,我們再來看下,最開始的代碼:

a = 3
b = a

可能聰明的讀者已經心里默默計算出對于對象3的引用計數器的值為2,分別為變量a和變量b對對象3的引用。是的,引用計數器的定義就是這么明了,用于表征用于指向同一個對象的引用的個數。通過變量間的賦值操作,自動的計算對象的引用計數。

那么,我們又會問引用計數器有啥用呢,為啥要多此一舉來計算有多少個變量引用同一個變量呢,此時我們引出一個新的概念:對象的垃圾回收。

2 對象的垃圾回收機制

有一段代碼:

a = 3
a = 'wali'
a = 3.1415926

我們會進一步思考,當我把a從指向整數對象3改變?yōu)橹赶蜃址畬ο蟆?code>wali'時,那對象3發(fā)生了啥 ?難道一直放在內存里,如果對象非常大,那豈不是很占用內存,實際上Python設計者早就為我們考慮的很周全了:

Python中,每當一個變量名被賦予了一個新的對象,之前的那個對象空間就會被回收(前提為此對象沒有被其他的變量名或對象所引用),這種自動回收對象空間的技術叫做垃圾回收。

這里如何判斷何時回收,就得用到上一節(jié)所說的一個非常重要的概念,對象引用計數器,當計數器值為0標識無變量或對象引用,自動回收對象空間。到此,我們明白了對象引用計數器的重要作用,也理解了,除了我們看到的代碼,Python也在默默的為我們做不少自動化的事情。

3 變量所指向的對象不同會有何不同?

#example 1
a = 3
b = a
a = 5 

我們回到上面的例子中,如果a發(fā)生變化,那么b會跟著發(fā)生變化嗎?理論上指向同一個對象是會跟著發(fā)生變化的,但是這里的答案是不會,因為對象3是數字,不可變對象,所以只能重新創(chuàng)建一個新的對象5,然后a指向對象5,但是如果a所指向的對象是一個可變的對象,比如說列表,就會和我們想的一樣b也會跟著發(fā)生變化,如下面的例子所示:

#example 2
a = [1,2,3]
b = a
a[0] = 3


L = a is b 
>>>True
M  =  a == b
>>>True

那么看下面的例子,例子2 和例子3 有什么區(qū)別呢?

#example 3
a = [1,2,3]
b = [1,2,3]
L = a is b
>>>False
M  =  a == b
>>>True

python中有兩種方法檢測變量是否相等,is 和 == ,其中==是判斷變量所指向的對象的值是否相等,is是判斷對象的同一性,如果兩個變量精確的指向同一對象,is操作符才會返回True,也可以理解為is操作符,是比較實現引用的指針是否相同,例子2中變量a和變量b指向同一個對象,所以L和M都是True,但是例子三中變量a和變量b指向不同的對象,所以才會出現例子3下面的L和M的值的不一樣的情況~但是如果下面的例子又會出現不同的結果:

#example 4
a = 3
b = 3
L = a is b
>>>True
M  =  a == b
>>>True

#example 5
c = [1,2,3]
K = c[2] is a
>>>True

是為什么呢?因為3 為不可變對象,為了節(jié)省內存消耗,只會保留一份,不管有多少個引用指向對象3,對象3都只有一份,例子5也很好的證明了這一點~

例子4和例子5中變量和對象的引用關系

課外小知識:

(1)可變類型,值可以改變:主要包括list列表,dict字典;不可變類型,值不可以改變:主要包括:數值類型int、longbool、float,字符串str,元組tuple

在例子3中變量a和b的所指向的對象為可變對象,并且a和b的地址不一樣,但是a和b中的元素所指向的對象其實是一樣的,如下圖所示

到此這篇關于Python中的變量賦值的文章就介紹到這了,更多相關Python變量賦值內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • numpy中的log和ln函數解讀

    numpy中的log和ln函數解讀

    這篇文章主要介紹了numpy中的log和ln函數解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 使用Python實現3D曲線擬合

    使用Python實現3D曲線擬合

    曲線擬合是數據分析和數學建模領域中廣泛使用的技術,它涉及到尋找最接近一組數據點的數學函數的過程,本文我們將討論如何使用SciPy庫在Python中執(zhí)行3D曲線擬合,感興趣的小伙伴可以了解下
    2023-11-11
  • Tensorflow 讀取ckpt文件中的tensor操作

    Tensorflow 讀取ckpt文件中的tensor操作

    這篇文章主要介紹了Tensorflow 讀取ckpt文件中的tensor操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Python操作MongoDB的教程分享

    Python操作MongoDB的教程分享

    MongoDB?是一個流行的?NoSQL?數據庫,以其半結構化的文檔存儲方式而聞名,本文將帶大家逐步了解如何使用Python與MongoDB進行交互,從連接到基本操作,快跟隨小編一起學習一下吧
    2023-08-08
  • Python IDLE或shell中切換路徑的操作

    Python IDLE或shell中切換路徑的操作

    這篇文章主要介紹了Python IDLE或shell中切換路徑的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • python中l(wèi)ogging庫的使用總結

    python中l(wèi)ogging庫的使用總結

    Python的logging模塊提供了通用的日志系統(tǒng),可以方便第三方模塊或者是應用使用,下面這篇文章主要給大家介紹了關于python中l(wèi)ogging庫使用的一些知識總結,文中給出了詳細的示例代碼,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-10-10
  • 深入理解Python虛擬機中描述器的實現原理

    深入理解Python虛擬機中描述器的實現原理

    這篇文章主要給大家介紹一個我們在使用類的時候經常使用但是卻很少在意的黑科技——描述器的實現原理,文中的示例代碼講解詳細,需要的可以參考一下
    2023-05-05
  • Anaconda3中的Jupyter notebook添加目錄插件的實現

    Anaconda3中的Jupyter notebook添加目錄插件的實現

    這篇文章主要介紹了Anaconda3中的Jupyter notebook添加目錄插件的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • python3.7 openpyxl 在excel單元格中寫入數據實例

    python3.7 openpyxl 在excel單元格中寫入數據實例

    這篇文章主要介紹了python3.7 openpyxl 在excel單元格中寫入數據實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • python3實現倒計時效果

    python3實現倒計時效果

    這篇文章主要為大家詳細介紹了python3實現倒計時效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08

最新評論