Python3 自學第6天:元組tuple

<head>/<head><body>

Python3 自學第6天:元組tuple

今天“極客乾貨”帶大家瞭解下元組tuple的知識。

元組tuple是一個比較常用的不可變序列;都說元組tuple和列表list很類似,不同之處在於元組一旦創建就不可改變

這是真的嗎?元組中的元素真的不能再修改嗎?元組和列表它們到底都有什麼樣的區別呢?下面我們就去一探究竟:

首先是元組的定義,它是用小括號( )來創建的,元素item間用逗號(,)隔開,實例代碼:

Python3 自學第6天:元組tuple

根據運行結果我們不難看出,元組中的元素item也可以是不同類型的對象,這點和列表list是一樣的;定義上列表list用的是中括號[];二者的元素之間都使用逗號(,)隔開的。

當元組中只有一個元素時該如何定義,實例代碼:

Python3 自學第6天:元組tuple

從上面的結果我們得出這樣一個結論:當元組tuple內只有一個元素時,元素後面必須要加上一個逗號(,);否則Python解釋器會把小括號當作運算符來計算,其結果就是一個整數5;為了消除這種歧義,Python要求在定義只有一個元素的元組時,元素的後面必須加上一個逗號(,);這點和列表list是不相同的。

元組tuple 索引和切片

元組tuple的索引和切片方法與列表list的索引和切片方法基本是一樣的;

都遵循 [頭下標:尾下標)“左閉右開”原則,也叫“包左不包右”原則,實例代碼:

Python3 自學第6天:元組tuple

我們修改下其中一個元素:

Python3 自學第6天:元組tuple

呃?!怎麼還報錯了呢?提示tuple對象不支持元素賦值。

哦,這就是我們常說的“元組tuple一旦定義就不可改變了”。

元組tuple 嵌套,實例代碼:

Python3 自學第6天:元組tuple

我們試著把元組中的'Java'改成'Go',實例代碼:

Python3 自學第6天:元組tuple

呃?不說是元組一旦定義後就不能改變了嗎,怎麼又可以改變了呢?這都把人搞糊塗了!細心的朋友就會發現,被改變的元素是一個list類型,因為列表是一個可變類型;

說的沒錯,是這樣子的。如果元組中的某個元素是一個不可改變的類型對象,如:常量,字符串等,那麼在修改這些不可變的元組的元素時就會報錯;如果元組中的某個元素是一個可變對象,如:列表list等,這時候是可以修改的,也不會報錯。

表面上看,tuple的元素確實變了,但其實變的不是tuple的元素,而是list的元素。

# 我們再來一例,繼續剖析:

Python3 自學第6天:元組tuple

前兩次del() 都報錯了,說明元組一旦創建後元素是不能被刪除的;其實字符串也有這個屬性的,一旦創建好之後,裡面的單字符串是不能被刪除的。

後面三次del() 刪除掉的是可變元素list中的子元素,當list可變元素中的子元素被全部刪除掉(空列表[])後,如果再繼續刪除就會報TypeError錯。

上面實例使用id()一直在“監控”元組最後一個元素的內存地址變化,發現無論怎麼刪除,它的內存地址一直保持不變。

如果我們對最後一個可變元素賦值會怎麼樣?實例代碼:

Python3 自學第6天:元組tuple

上面報IndexError下標越界異常是因為tuple_org[-1]這時候已經是一個空列表[ ]了,裡面是沒有任何元素的,[0]代表第1位元素的位置,故而報錯;

上面實例的整個過程,無論怎麼給最後一個元素賦值都會報錯(老司機翻車了?呵呵)

tuple_org[-1],你是去了趟泰國嗎?變性了?

言歸正傳,結合上面的實例和id()函數的輸出結果,我們分析下:

元組tuple它是一個不可變序列,所謂的元組“不可變”是指元組中的每個元素它的內存指向永遠不變。所有的不可變序列在第一次定義後“內存指向”就不可以再修改了,它包含了對其他對象的引用,這些引用對象有可能是可變的或可修改的;

雖說元組中的元素值不允許修改的,但我們可以用 = 對元組進行拼接,實例代碼:

Python3 自學第6天:元組tuple

經過 += 追加操作之後,a元組的內存地址發生了變化,因為它給新進來的元素重新分配了內存地址。

Python內置函數:

len()求序列的元素個數,sorted()對序列進行排序,實例代碼:

Python3 自學第6天:元組tuple

注意:sorted()內置函數對元組排序時,返回的並不是一個新的元組對象,而是一個排好序的列表list對象,而元組本身並沒有任何變化;

把元組轉換為列表,實例代碼:

Python3 自學第6天:元組tuple

雖然元組中的元素值是不允許刪除的,但我們可以使用del語句來刪除整個元組,實例代碼:

Python3 自學第6天:元組tuple

對了,元組沒有自己的方法,而列表是有自己的操作方法的。

最後,我們再總結一下:

元組本身所指向的內存,實際上保存的是元組內數據的內存地址集合,元組一旦建立,這個內存地址集合就不能修改和刪除了。一旦集合內的地址發生改變,就必須重新分配元組空間保存新的內存地址集。

隨便提一下:

元組還有一個升級版本:具名元組 namedtuple,它是collections模塊中的函數對象。

具名元組會放到後續的面向對象中給大家介紹一下,因為它需要結合類對象來使用才能說的明白些。感興趣的朋友可以自己先去了解一下。

看完上面的這些實例和分析,大家對元組這種不可變序列的理解是不是更深一層了呢。

OK!Python數據類型中的元組tuple就分享到這裡,如果您有什麼問題,請在評論區留言,我會及時回覆,感謝!

【極客乾貨】從事IT行業十餘年,在移動互聯網開發,J2EE企業級開發,IOT物聯網,AI人工智能等方面有點技術積累,熟練使用C/C++,Java,Python等編程語言。從2009年開始接觸Python,後續借空閒時間將個人熟悉的技術乾貨系統性分享給大家,也許我的分享會讓你少走一些彎路,如果您覺得還可以,請多多關注,評論和轉發,非常感謝!

昨天有網友建議把實例代碼截圖的底色和字體大小調整下,今天採納了;不過截圖中字體大小調整的再大,手機屏幕寬度是有限的,截圖在手機上自適應後字體看來還是不太,這點暫時沒有辦法,還請大家諒解!可能是本人習慣的原因,感覺白底截圖沒有黑底看起來舒服,現在通過投票徵求一下大家的意見,感謝!

實例代碼截圖底色用白還是用黑呢 (單選)
0人
0%
黑色
0人
0%
白色
0人
0%
都可以
<button>投票/<button>
/<body>


分享到:


相關文章: