亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python中l(wèi)ist.copy方法用法詳解

 更新時間:2023年02月07日 15:53:18   作者:不愿透露姓名的余菜鳥  
這篇文章主要給大家介紹了關(guān)于python中l(wèi)ist.copy方法使用的相關(guān)資料,文中還介紹了python?list.copy()?和?copy.deepcopy()區(qū)別,需要的朋友可以參考下

當(dāng)我們想復(fù)制兩個一模一樣的列表時,我們可能使用到list.copy()這個方法,這個方法可以讓我們復(fù)制一個相同的數(shù)組,當(dāng)遇到下面這種情況時,可能會遇到一些問題

# _*_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()這個函數(shù)在執(zhí)行的時候,指向的不是nameList在內(nèi)存中的地址,而是重新復(fù)制了一份,此時兩個列表在內(nèi)存中的地址不同,我們可以打印出來看看

使用如下代碼可以見到,兩個列表的內(nèi)存已經(jīng)有差別了

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中生效

而當(dāng)nameList中又存在數(shù)組時,情況又會發(fā)生變化

# _*_coding='utf8'_*_
nameList = [1, 2, 3, [3, 4, 5], 4, 5]
nameList1 = nameList.copy()
nameList[3][2] = 55
print(nameList, nameList1)

輸入如下內(nèi)容

[1, 2, 3, [3, 4, 55], 4, 5] [1, 2, 3, [3, 4, 55], 4, 5]

可以看到兩個list中嵌套的數(shù)組都發(fā)生了變化,這是因為在列表中存放的二維列表,實際上存放的是二維列表在內(nèi)存中的地址,當(dāng)修改其中一個列表,另外一個自然也會受到影響,那么,讓我們來驗證一下是不是存放的內(nèi)存地址。

同樣的,我們使用id()這個方法來取出內(nèi)存地址

# _*_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]))

輸出如下內(nèi)容

2879859422336 2879859422336

可以看到,兩個內(nèi)存地址是相同的

copy方法介紹到此結(jié)束

補充: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 是原數(shù)組
  • list2 和 list3 都是list1的淺拷貝,淺拷貝到底是什么意思?

python的list里面存的都是引用,如果存的是listnode,實際上存的是listnode的引用,也就是地址,畢竟如果listnode里存了很多關(guān)于這個node的信息的話,直接在list里面存這段信息的地址就很方便,等到要用這段信息的時候(比如list1[0].val),只要找到地址(list1[0])再到這段地址取值(.val)就可以了。

淺拷貝的意思是,開辟一段內(nèi)存,這段內(nèi)存里復(fù)制了原list的地址。

地址還是那個地址,所以可以看出**id(list1[0]),id(list2[0])**是完全一樣的。這會帶來的問題是,當(dāng)我們把這段地址里的值.val變化一下(list1[0].val = 5), 淺拷貝的數(shù)組里對應(yīng)元素的值也就跟著變了

深拷貝就厲害了,不光把原數(shù)組存的地址拷貝了,就連原數(shù)組地址里對應(yīng)的數(shù)據(jù)也都進行了復(fù)制,所以可以看到**id(list1[0]),id(list4[0])**變得不一樣了

總結(jié)

到此這篇關(guān)于python中l(wèi)ist.copy方法用法的文章就介紹到這了,更多相關(guān)python list.copy方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論