日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python札记 -- 切片赋值

發布時間:2024/3/13 python 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python札记 -- 切片赋值 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、疑惑
??? 今天在看《Python Cookbook》第四章Python技巧的4.7小節時,發現一段初看起來讓人疑惑的代碼。該小節的任務是將一個包含列表(行)的列表,轉換成一個新的列表。新的列表包含了同樣的行,但是其中一些列被刪除或者重新排序了。讓人疑惑的代碼如下:

1 listOfRows = [[1,2,3,4], [5,6,7,8], [9,10,11,12]] 2 listOfRows[:] = [[row[0], row[3], row[2]] for row in listOfRows]

竹風不禁疑惑了,這第二行的代碼為啥會用 "listOfRows[:] =" 這種寫法?直接寫成 "listOfRows =" 不行么?這兩者間有什么區別呢?

二、線索
??? 疑惑主要集中在對切片進行賦值上。抱著“實踐是檢驗真理的唯一標準”,竹風做了個小實驗:

1 >>> test_li = ['a','b','c','d','e','f'] #進行測試的list 2 >>> test_li[1:4] #簡單的切片操作 3 ['b', 'c', 'd'] 4 >>> id(test_li) #觀察一下測試list的id 5 139718916544776 6 >>> test_li[1:4] = [1,2] #對切片進行賦值,而且是不對等的賦值 7 >>> test_li #觀察賦值后的list 8 ['a', 1, 2, 'e', 'f'] 9 >>> id(test_li) #id沒有變化,說明是在原對象上進行修改 10 139718916544776 11 >>>

配合注釋來看的話,對切片賦值貌似是在原對象上進行修改。而且值得注意的是,切片賦值還支持元素個數不相等的操作,比如實驗中用[1,2]替換了['b','c','d']

三、真相
??? 那么真相是什么呢,讓我們繼續實踐一下:

1 >>> listOfRows = [[1,2,3,4], [5,6,7,8], [9,10,11,12]] 2 >>> 3 >>> li = listOfRows 4 >>> id(listOfRows) 5 139718916543336 6 >>> id(li) #兩者的id相同,說明引用了同一個對象 7 139718916543336 8 >>> listOfRows = [[row[0], row[3], row[2]] for row in listOfRows] 9 >>> listOfRows #使用列表推導產生的結果符合預期 10 [[1, 4, 3], [5, 8, 7], [9, 12, 11]] 11 >>> li #li沒有改變 12 [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]] 13 >>> id(listOfRows) 14 139718916544416 15 >>> id(li) #兩者id不同,說明listOfRows綁定了一個新的對象 16 139718916543336 17 >>>

直接使用 "listOfRows =" 的話,產生了一個新的對象,讓我們繼續看看 "listOfRows[:] =" 的效果:

1 >>> listOfRows = [[1,2,3,4], [5,6,7,8], [9,10,11,12]] 2 >>> 3 >>> li = listOfRows 4 >>> id(listOfRows) 5 140034137774560 6 >>> id(li) #兩者id一致,引用了同一個對象 7 140034137774560 8 >>> listOfRows[:] = [[row[0], row[3], row[2]] for row in listOfRows] 9 >>> listOfRows #使用切片賦值,達到預期效果 10 [[1, 4, 3], [5, 8, 7], [9, 12, 11]] 11 >>> li #li也發生了變化,因為兩者綁定的是同一個對象 12 [[1, 4, 3], [5, 8, 7], [9, 12, 11]] 13 >>> id(listOfRows) 14 140034137774560 15 >>> id(li) #兩者的id都沒有變化,說明切片賦值實在原對象上修改 16 140034137774560 17 >>>

??? 最后的結束語了:列表推導會產生一個新的列表,而不是修改現有的列表。如果需要一個新的對象,那么可以使用 "listOfRows ="? 寫法。當需要修改一個現有的列表時,最好的辦法是將現有列表的內容賦值為一個列表推導,也就是使用"listOfRows[:] =" 寫法。簡單地說,使用切片賦值可以修改原對象的類容,而不是創建一個新對象。謝謝大家~~

轉載于:https://www.cnblogs.com/PandaBamboo/p/3261646.html

總結

以上是生活随笔為你收集整理的Python札记 -- 切片赋值的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。