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

Python中列表乘法和列表推導式的區(qū)別舉例詳解

 更新時間:2025年04月07日 11:01:53   作者:程序員阿甘  
在Python中列表是一種非常靈活和強大的數(shù)據(jù)結構,支持多種運算和操作,這篇文章主要介紹了Python中列表乘法和列表推導式區(qū)別的相關資料,文中通過代碼就介紹的非常詳細,需要的朋友可以參考下

可變對象與不可變對象

python中對象有兩種類型:

  • 可變對象類型:list、dict、set
  • 不可變對象類型:tuple、string、int、float、bool

我們可以簡單理解為:

  • 可變對象類型的變量中記錄是:對象的地址值
  • 不可變對象類型的變量中記錄時:對象的值

可變對象類型變量 list1 和 list2 可以通過相同地址值,指向同一個對象

list1 = [1, 2, 3, 4, 5]
list2 = list1  # 將list1的地址值賦給list2,使得list1,list2指向同一個對象

list1[0] = 2  # list1 修改對象內(nèi)容

print(list1)
print(list2)  # list2 和 list1 指向的是同一個對象,因此list2打印結果和list1相同

但是不可變對象類型的變量,不具備上面特點

num1 = 10
num2 = num1

num1 -= 1

print(num1)  # 9
print(num2)  # 10

生成含 x 個 不可變對象 的列表

列表乘法

list1 = [0] * 2

列表推導式

list2 = [0 for _ in range(2)]

 由于 0 是不可變對象,因此這兩種方式生成的列表沒有區(qū)別。

生成含 x 個 可變對象 的列表

 列表乘法

list1 = [[]] * 2

列表推導式

list2 = [[] for _ in range(2)]

[]列表,屬于可變對象,此時上面兩種方式生成的列表是有區(qū)別的

list1 = [[]] * 2
list2 = [[] for _ in range(2)]

print(list1)  # [[], []]
print(list2)  # [[], []]

list1[0].append(0)
list2[0].append(0)

print(list1)  # [[0], [0]]
print(list2)  # [[0], []]

通過運行上面代碼,我們可以發(fā)現(xiàn),list1的打印結果似乎不太對勁。我們只是向 list1[0] 中追加了一個數(shù)值0,但是list1[1] 也被追加了一個數(shù)值0。

而 list2 沒有發(fā)生這樣的問題。

列表類型屬于可變對象類型,列表類型的變量本質(zhì)記錄的是對象的地址值,我們可以使用id函數(shù)來獲取對象的地址值,因此我們可以將 list1 和 list2 內(nèi)部元素的地址值打印出來看看

list1 = [[]] * 2
list2 = [[] for _ in range(2)]

print(list(map(id, list1)))  # [2779372310784, 2779372310784]
print(list(map(id, list2)))  # [2779372317376, 2779372633152]

可以發(fā)現(xiàn),list1 中兩個元素的對象地址值是相同的,而 list2 中兩個元素的對象地址值是不相同的。

也就是說,list1中雖然有兩個元素,但是這兩個元素的對象地址值相同,即指向同一個對象,就好比兩條繩子(變量)A,B牽著一頭牛(對象),你通過繩子 A 把牛拽過來給它掛了個鈴鐺后,你再通過繩子 B 再把牛拽過來,發(fā)現(xiàn)它就是剛剛被掛鈴鐺的牛。

牛是同一頭牛,但是有兩條繩子牽著它。你無論通過哪個繩子拽牛,拽來的都是同一頭牛。

也就說,列表乘法不會生成新的牛,只是生成了牽著同一頭牛的多條繩子。

那么列表推導式,是會生成新的牛嗎?我們不妨再看下面代碼:

ele = []
list2 = [ele for _ in range(2)]

print(list2)  # [[], []]

list2[0].append(0)

print(list2)  # [[0], [0]]

此時,我們發(fā)現(xiàn) list2 發(fā)生之前相同的問題。我們打印此時 list2 內(nèi)部元素的地址值,發(fā)現(xiàn)內(nèi)部兩個元素也指向了同一個對象。

ele = []
list2 = [ele for _ in range(2)]

print(list(map(id, list2)))  # [1849845272832, 1849845272832]

造成問題出現(xiàn)的原因是,list2 的生成代碼做了如下改變:

list2 = [[] for _ in range(2)]

變?yōu)榱?/p>

ele = []
list2 = [ele for _ in range(2)]

list2 = [[] for _ in range(2)] 給了我們一種錯覺,似乎這種方式可以產(chǎn)生新的對象,但是實際上,列表推導式只是一種語法糖,它只是對 for 循環(huán)的寫法上的簡化,你可以認為列表推導式:

list2 = [[] for _ in range(2)]

等價于 

list2 = []
for _ in range(2):
    list2.append([])

其中 [] 其實是一種動作,表示:創(chuàng)建一個空列表,比如:

  • list2 = [],表示創(chuàng)建一個空列表后,賦值給 list2
  • list2.append([]),表示創(chuàng)建一個空列表后,追加到 list2 尾部

那么:

ele = []
list2 = [ele for _ in range(2)]

其實可以認為等價于

ele = []

list2 = []
for _ in range(2):
    list2.append(ele)

上面代碼中

  • ele = [],表示創(chuàng)建了一個空列表賦值給 ele
  • list2.append(ele),表示將 ele的地址值 追加到 list2 尾部

這種方式本質(zhì)和列表乘法并無區(qū)別。

總結

列表乘法 [x] * n,本質(zhì)是將要元素 x 復制 n 次。

若要重復的元素 x 是不可變對象類型,則使用列表乘法后,會將元素 x 的值復制多次,最終生成的列表中的每個元素:值相同,但是不是同一個對象。

若要重復的元素 x 是可變對象類型,則使用列表乘法后,會將元素 x 的對象地址值復制多次,最終生成的列表中元素:地址值相同,都指向同一個對象。

列表推導式,本質(zhì)是一種語法糖,它只是簡化了 for 循環(huán)寫法。在代碼理解上,我們還是應該將列表推導式當成普通 for 循環(huán)來解讀。

到此這篇關于Python中列表乘法和列表推導式區(qū)別的文章就介紹到這了,更多相關Python列表乘法和列表推導式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 詳解Python Matplot中文顯示完美解決方案

    詳解Python Matplot中文顯示完美解決方案

    這篇文章主要介紹了Python Matplot中文顯示完美解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • OPENCV去除小連通區(qū)域,去除孔洞的實例講解

    OPENCV去除小連通區(qū)域,去除孔洞的實例講解

    今天小編就為大家分享一篇OPENCV去除小連通區(qū)域,去除孔洞的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • 學會這29個常用函數(shù),你就是Pandas專家

    學會這29個常用函數(shù),你就是Pandas專家

    Pandas?無疑是?Python?處理表格數(shù)據(jù)最好的庫之一,但是很多新手無從下手,這里總結出最常用的?29?個函數(shù),感興趣的小伙伴可以跟隨小編一起學習一下
    2022-11-11
  • 通過Python 獲取Android設備信息的輕量級框架

    通過Python 獲取Android設備信息的輕量級框架

    今天跟大家分享一下,如何通過Python實現(xiàn)一個輕量級的庫來獲取電腦上連接的Android設備信息,需要的朋友參考下吧
    2017-12-12
  • python中的字符串切割 maxsplit

    python中的字符串切割 maxsplit

    這篇文章主要介紹了python中的字符串切割 maxsplit,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • python輸出指定月份日歷的方法

    python輸出指定月份日歷的方法

    這篇文章主要介紹了python輸出指定月份日歷的方法,涉及Python中calendar模塊操作日期的相關技巧,需要的朋友可以參考下
    2015-04-04
  • Python使用PymuPDF處理PDF文件的操作詳解

    Python使用PymuPDF處理PDF文件的操作詳解

    Python 中的 PymuPDF 是一個強大的庫,可以讓你輕松地處理 PDF 文件,本文將深入探討 PymuPDF 的用法,包括打開、讀取、修改和創(chuàng)建 PDF 文件,以及文本提取和頁面操作,感興趣的朋友可以參考下
    2023-12-12
  • Python實現(xiàn)向QQ群成員自動發(fā)郵件的方法

    Python實現(xiàn)向QQ群成員自動發(fā)郵件的方法

    這篇文章主要介紹了Python實現(xiàn)向QQ群成員自動發(fā)郵件的方法,通過讀取txt文本里的QQ成員數(shù)據(jù)再調(diào)用發(fā)送郵件函數(shù)實現(xiàn)該功能,是非常實用的技巧,需要的朋友可以參考下
    2014-11-11
  • Python3實現(xiàn)的判斷環(huán)形鏈表算法示例

    Python3實現(xiàn)的判斷環(huán)形鏈表算法示例

    這篇文章主要介紹了Python3實現(xiàn)的判斷環(huán)形鏈表算法,涉及Python針對環(huán)形鏈表的遍歷、判斷相關操作技巧,需要的朋友可以參考下
    2019-03-03
  • Python自動化之實現(xiàn)桌面壁紙下載器

    Python自動化之實現(xiàn)桌面壁紙下載器

    隨著計算機性能的提升,人們對計算機個性化的要求也越來越高了,自己使用的計算機當然要設置成自己喜歡的風格!本文就來用Python做個桌面壁紙下載器,需要的可以參考一下
    2022-11-11

最新評論