最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

可變對(duì)象與不可變對(duì)象

python中對(duì)象有兩種類型:

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

我們可以簡(jiǎn)單理解為:

  • 可變對(duì)象類型的變量中記錄是:對(duì)象的地址值
  • 不可變對(duì)象類型的變量中記錄時(shí):對(duì)象的值

可變對(duì)象類型變量 list1 和 list2 可以通過(guò)相同地址值,指向同一個(gè)對(duì)象

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

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

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

但是不可變對(duì)象類型的變量,不具備上面特點(diǎn)

num1 = 10
num2 = num1

num1 -= 1

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

生成含 x 個(gè) 不可變對(duì)象 的列表

列表乘法

list1 = [0] * 2

列表推導(dǎo)式

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

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

生成含 x 個(gè) 可變對(duì)象 的列表

 列表乘法

list1 = [[]] * 2

列表推導(dǎo)式

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

[]列表,屬于可變對(duì)象,此時(shí)上面兩種方式生成的列表是有區(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], []]

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

而 list2 沒(méi)有發(fā)生這樣的問(wèn)題。

列表類型屬于可變對(duì)象類型,列表類型的變量本質(zhì)記錄的是對(duì)象的地址值,我們可以使用id函數(shù)來(lái)獲取對(duì)象的地址值,因此我們可以將 list1 和 list2 內(nèi)部元素的地址值打印出來(lá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 中兩個(gè)元素的對(duì)象地址值是相同的,而 list2 中兩個(gè)元素的對(duì)象地址值是不相同的。

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

牛是同一頭牛,但是有兩條繩子牽著它。你無(wú)論通過(guò)哪個(gè)繩子拽牛,拽來(lái)的都是同一頭牛。

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

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

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

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

list2[0].append(0)

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

此時(shí),我們發(fā)現(xiàn) list2 發(fā)生之前相同的問(wèn)題。我們打印此時(shí) list2 內(nèi)部元素的地址值,發(fā)現(xiàn)內(nèi)部?jī)蓚€(gè)元素也指向了同一個(gè)對(duì)象。

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

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

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

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

變?yōu)榱?/p>

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

list2 = [[] for _ in range(2)] 給了我們一種錯(cuò)覺(jué),似乎這種方式可以產(chǎn)生新的對(duì)象,但是實(shí)際上,列表推導(dǎo)式只是一種語(yǔ)法糖,它只是對(duì) for 循環(huán)的寫(xiě)法上的簡(jiǎn)化,你可以認(rèn)為列表推導(dǎo)式:

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

等價(jià)于 

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

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

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

那么:

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

其實(shí)可以認(rèn)為等價(jià)于

ele = []

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

上面代碼中

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

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

總結(jié)

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

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

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

列表推導(dǎo)式,本質(zhì)是一種語(yǔ)法糖,它只是簡(jiǎn)化了 for 循環(huán)寫(xiě)法。在代碼理解上,我們還是應(yīng)該將列表推導(dǎo)式當(dāng)成普通 for 循環(huán)來(lái)解讀。

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

相關(guān)文章

  • 粗暴解決CUDA out of memory的問(wèn)題

    粗暴解決CUDA out of memory的問(wèn)題

    這篇文章主要介紹了粗暴解決CUDA out of memory的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • Django城市信息查詢功能的實(shí)現(xiàn)步驟

    Django城市信息查詢功能的實(shí)現(xiàn)步驟

    Django中的查詢操作是數(shù)據(jù)庫(kù)操作中一個(gè)非常重要的技術(shù),下面這篇文章主要給大家介紹了關(guān)于Django城市信息查詢功能的實(shí)現(xiàn)步驟,文中通過(guò)實(shí)例代碼和圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • python命名關(guān)鍵字參數(shù)的作用詳解

    python命名關(guān)鍵字參數(shù)的作用詳解

    在本篇文章里小編給大家整理了一篇關(guān)于python命名關(guān)鍵字參數(shù)的作用詳解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)參考下。
    2021-03-03
  • Python檢查ping終端的方法

    Python檢查ping終端的方法

    今天小編就為大家分享一篇Python檢查ping終端的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • python解決No?module?named?pip問(wèn)題兩種方法

    python解決No?module?named?pip問(wèn)題兩種方法

    當(dāng)出現(xiàn)No module named pip錯(cuò)誤時(shí),表明您的Python環(huán)境缺少pip模塊,下面這篇文章主要給大家介紹了關(guān)于python解決No?module?named?pip問(wèn)題的兩種方法,需要的朋友可以參考下
    2024-01-01
  • Django values()和value_list()的使用

    Django values()和value_list()的使用

    這篇文章主要介紹了Django values()和value_list()的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-03-03
  • python中四舍五入的正確打開(kāi)方式

    python中四舍五入的正確打開(kāi)方式

    這篇文章主要介紹了python中四舍五入的正確打開(kāi)方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Python實(shí)現(xiàn)高分辨率圖像導(dǎo)航的代碼

    Python實(shí)現(xiàn)高分辨率圖像導(dǎo)航的代碼

    高分辨率圖像導(dǎo)航是一種技術(shù),它允許用戶在大型圖像中進(jìn)行導(dǎo)航和瀏覽,而無(wú)需加載整個(gè)圖像到內(nèi)存中,在本文中,我們將使用30行Python代碼實(shí)現(xiàn)這一功能,我們將使用Python的圖像處理庫(kù)和計(jì)算機(jī)視覺(jué)庫(kù)來(lái)加載圖像數(shù)據(jù)并生成高分辨率圖像導(dǎo)航
    2024-03-03
  • Python可視化繪制圖表的教程詳解

    Python可視化繪制圖表的教程詳解

    python?有許多可視化工具,但本文主要為大家介紹一下Matplotlib。Matplotlib是一種2D的繪圖庫(kù),它可以支持硬拷貝和跨系統(tǒng)的交互,感興趣的可以了解一下
    2022-10-10
  • windows下python安裝小白入門教程

    windows下python安裝小白入門教程

    這篇文章主要為大家詳細(xì)介紹了windows下python安裝小白入門教程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09

最新評(píng)論

康马县| 晋宁县| 慈利县| 大田县| 论坛| 临猗县| 武义县| 扎兰屯市| 张家界市| 奈曼旗| 石景山区| 德化县| 鄂伦春自治旗| 手机| 巴塘县| 老河口市| 惠安县| 太保市| 吴川市| 遵化市| 仁布县| 峡江县| 德惠市| 新和县| 金寨县| 新巴尔虎左旗| 通渭县| 新化县| 岳普湖县| 龙海市| 桑日县| 阜新| 仁化县| 曲麻莱县| 丰城市| 崇左市| 永仁县| 水富县| 大荔县| 理塘县| 美姑县|