python中l(wèi)ist.copy方法用法詳解
當我們想復制兩個一模一樣的列表時,我們可能使用到list.copy()這個方法,這個方法可以讓我們復制一個相同的數組,當遇到下面這種情況時,可能會遇到一些問題
# _*_coding='utf8'_*_ nameList = [1, 2, 3, 4, 5] nameList1 = nameList.copy() nameList[1] = 55 print(nameList, nameList1)
此時打印出nameList和nameList1時,兩個列表的元素是下面這樣
[1, 55, 3, 4, 5] [1, 2, 3, 4, 5]
可以看到列表的第二個元素不一樣
這是因為在python中l(wèi)ist.copy()這個函數在執(zhí)行的時候,指向的不是nameList在內存中的地址,而是重新復制了一份,此時兩個列表在內存中的地址不同,我們可以打印出來看看
使用如下代碼可以見到,兩個列表的內存已經有差別了
nameList = [1, 2, 3, [3, 4, 5], 4, 5] nameList1 = nameList.copy() nameList[1] = 55 print(id(nameList), id(nameList1))
2207528867520 2207531826048
此時修改的nameList[1] = 55并不會在nameList1中生效
而當nameList中又存在數組時,情況又會發(fā)生變化
# _*_coding='utf8'_*_ nameList = [1, 2, 3, [3, 4, 5], 4, 5] nameList1 = nameList.copy() nameList[3][2] = 55 print(nameList, nameList1)
輸入如下內容
[1, 2, 3, [3, 4, 55], 4, 5] [1, 2, 3, [3, 4, 55], 4, 5]
可以看到兩個list中嵌套的數組都發(fā)生了變化,這是因為在列表中存放的二維列表,實際上存放的是二維列表在內存中的地址,當修改其中一個列表,另外一個自然也會受到影響,那么,讓我們來驗證一下是不是存放的內存地址。
同樣的,我們使用id()這個方法來取出內存地址
# _*_coding='utf8'_*_ nameList = [1, 2, 3, [3, 4, 5], 4, 5] nameList1 = nameList.copy() nameList[3][2] = 55 print(id(nameList[3]), id(nameList1[3]))
輸出如下內容
2879859422336 2879859422336
可以看到,兩個內存地址是相同的
copy方法介紹到此結束
補充:python list.copy() 和 copy.deepcopy()區(qū)別
舉個例子
import copy class ListNode: def __init__(self, x): self.val = x self.next = None def __repr__(self): return str(self.val) list1 = [ListNode(1), ListNode(2)] list2 = list1.copy() list3 = list1[:] list4 = copy.deepcopy(list1) print(list1, list2, list3, list4) # [1, 2] [1, 2] [1, 2] [1, 2] list1[0].val = 5 print(list1, list2, list3, list4) # [5, 2] [5, 2] [5, 2] [1, 2] list1.append(ListNode(10)) print(list1, list2, list3, list4) # [5, 2, 10] [5, 2] [5, 2] [1, 2] print(id(list1[0]),id(list2[0]),id(list3[0]),id(list4[0])) # 1984073709792 1984073709792 1984073709792 1984073707824
解釋
- list1 是原數組
- list2 和 list3 都是list1的淺拷貝,淺拷貝到底是什么意思?
python的list里面存的都是引用,如果存的是listnode,實際上存的是listnode的引用,也就是地址,畢竟如果listnode里存了很多關于這個node的信息的話,直接在list里面存這段信息的地址就很方便,等到要用這段信息的時候(比如list1[0].val),只要找到地址(list1[0])再到這段地址取值(.val)就可以了。
淺拷貝的意思是,開辟一段內存,這段內存里復制了原list的地址。
地址還是那個地址,所以可以看出**id(list1[0]),id(list2[0])**是完全一樣的。這會帶來的問題是,當我們把這段地址里的值.val變化一下(list1[0].val = 5), 淺拷貝的數組里對應元素的值也就跟著變了
深拷貝就厲害了,不光把原數組存的地址拷貝了,就連原數組地址里對應的數據也都進行了復制,所以可以看到**id(list1[0]),id(list4[0])**變得不一樣了
總結
到此這篇關于python中l(wèi)ist.copy方法用法的文章就介紹到這了,更多相關python list.copy方法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python開發(fā)企業(yè)微信機器人每天定時發(fā)消息實例
這篇文章主要介紹了Python開發(fā)企業(yè)微信機器人每天定時發(fā)消息實例,需要的朋友可以參考下2020-03-03Tensorflow2.10使用BERT從文本中抽取答案實現詳解
這篇文章主要為大家介紹了Tensorflow2.10使用BERT從文本中抽取答案實現詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04pyqt5 鍵盤監(jiān)聽按下enter 就登陸的實例
今天小編就為大家分享一篇pyqt5 鍵盤監(jiān)聽按下enter 就登陸的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06