精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Python中淺拷貝與深拷貝的操作

科技綠洲 ? 來源:機器學習算法與Python實戰 ? 作者:機器學習算法與 ? 2023-11-02 10:58 ? 次閱讀

【例子】淺拷貝與深拷貝中

list1 = [123, 456, 789, 213]
list2 = list1
list3 = list1[:]
print(list2)  
# [123, 456, 789, 213]
print(list3)  
# [123, 456, 789, 213]
list1.sort()
print(list2)  
# [123, 213, 456, 789] 
**print(list3)  
# [123, 456, 789, 213]**
list1 = [[123, 456], [789, 213]]
list2 = list1
list3 = list1[:]
print(list2)  
# [[123, 456], [789, 213]]
print(list3)  
# [[123, 456], [789, 213]]
list1[0][0]  = 111
print(list2)  
# [[111, 456], [789, 213]]
**print(list3)  
# [[111, 456], [789, 213]]

小朋友,你是否有很多問號?????

為什么同樣是list3 = list1[:]
執行list1.sort() 操作,list3不發生變化
執行list1[0][0] = 111 操作,list3發生變化

首先我們先了解到python的拷貝有淺拷貝和深拷貝之分

序號操作語句拷貝類型
1Y= X直接賦值(淺拷貝)
2Z = X [:]淺拷貝
3P = copy.copPy(X)淺拷貝
4K = copy.deepcopy(X)深拷貝

接下來我們來探索一下,這些個淺拷貝和深拷貝具體細節上有什么區別呢?

看看這個case

import copy
X = [1,3,5,['我','是','第','二','維','度'],9,11]
Y= X # 直接賦值(淺拷貝)
Z = X [:] # 淺拷貝 
P = copy.copy(X)  # 淺拷貝 
K = copy.deepcopy(X)# 深拷貝 

#現在我們在X數組的第三個值里面添加一個'哈哈',把里面的是改為不是
X[3].append('哈哈')
X[3][1] = '不是'

#我們打印一下結果瞧一瞧
print("起始列表X為 : ", X)
print("把X列表賦值給Y為 : ", Y)
print("淺拷貝X列表給Z為 : ", Z)
print("淺拷貝X列表給P為 : ", P)
print("深拷貝X列表給K為 : ", K)

輸出結果為:

起始列表X為 :  [1, 3, 5, ['我', '不是', '第', '二', '維', '度', '哈哈'], 9, 11]
把X列表賦值給Y為 :  [1, 3, 5, ['我', '不是', '第', '二', '維', '度', '哈哈'], 9, 11]
淺拷貝X列表給Z為 :  [1, 3, 5, ['我', '不是', '第', '二', '維', '度', '哈哈'], 9, 11]
淺拷貝X列表給P為 :  [1, 3, 5, ['我', '不是', '第', '二', '維', '度', '哈哈'], 9, 11]
深拷貝X列表給K為 :  [1, 3, 5, ['我', '是', '第', '二', '維', '度'], 9, 11]

是不是發現深拷貝與淺拷貝的一點點區別啦 ^ . ^只有深拷貝不被更改**!!!**


辣么,我現在想要把X列表的第三值 ['我','是','第','二','維','度'] 改為 7,把最后一個值改為101,看看這些個淺拷貝和深拷貝又是怎么表現的......

import copy
X = [1,3,5,['我','是','第','二','維','度'],9,11]
Y= X  # 直接賦值(淺拷貝)
Z = X [:] # 淺拷貝 
P = copy.copy(X) # 淺拷貝 
K = copy.deepcopy(X)# 深拷貝

現在我們修改X數組的第三個值,把最后一個值改為101

X[3] = 7
X[-1] = 101

我們打印一下結果瞧一瞧

print("起始列表X為 : ", X)
print("把X列表賦值給Y為 : ", Y)
print("淺拷貝X列表給Z為 : ", Z)
print("淺拷貝X列表給P為 : ", P)
print("深拷貝X列表給K為 : ", K)

輸出結果為:

起始列表X為 :  [1, 3, 5, 7, 9, 101]X列表賦值給Y為 :  [1, 3, 5, 7, 9, 101]  
淺拷貝X列表給Z為 :  [1, 3, 5, ['我', '是', '第', '二', '維', '度'], 9, 11]  
淺拷貝X列表給P為 :  [1, 3, 5, ['我', '是', '第', '二', '維', '度'], 9, 11]  
深拷貝X列表給K為 :  [1, 3, 5, ['我', '是', '第', '二', '維', '度'], 9, 11]

咦!?發現了什么 ~. ~有的淺拷貝背叛了同胞 ! 和深拷貝的表現是一樣的


結合上面的例子,我們發現,對二維列表中的第一維數據做修改時,使用 = 進行賦值,對X的修改會影響Y,使用 [:] , copy.copy() , copy.deepcopy() 進行賦值,對X的修改不會影響新的賦值。

如果是對二維列表中的第一維數據做增加或者刪除操作呢?試一試咯

import copy
X = [1,3,5,['我','是','第','二','維','度'],9,11]
Y= X  # 直接賦值(淺拷貝)
Z = X [:]# 淺拷貝 
P = copy.copy(X) # 淺拷貝 
K = copy.deepcopy(X)# 深拷貝 

#在X數組最后添加13,刪除第0個值
X.append(13)
X.remove(1)

#我們打印一下結果瞧一瞧
print("起始列表X為 : ", X)
print("把X列表賦值給Y為 : ", Y)
print("淺拷貝X列表給Z為 : ", Z)
print("淺拷貝X列表給P為 : ", P)
print("深拷貝X列表給K為 : ", K)

輸出結果為:

起始列表X為 :  [3, 5, ['我', '是', '第', '二', '維', '度'], 9, 11, 13]  
把X列表賦值給Y為 :  [3, 5, ['我', '是', '第', '二', '維', '度'], 9, 11, 13]  
淺拷貝X列表給Z為 :  [1, 3, 5, ['我', '是', '第', '二', '維', '度'], 9, 11]  
淺拷貝X列表給P為 :  [1, 3, 5, ['我', '是', '第', '二', '維', '度'], 9, 11]  
深拷貝X列表給K為 :  [1, 3, 5, ['我', '是', '第', '二', '維', '度'], 9, 11]

我們發現,對二維列表中的第一維數據做增加或者刪除操作
同樣是只有使用 = 進行賦值,對X的修改會影響Y
于是乎,我們可以把上面的 修改 擴充為 增刪改 (改也就包括了排序sort()操作喲)
即對二維列表中的第一維數據做 增刪改 操作時,blabla......

你以為這就結束了嗎?

我,第二維數據不想被修改,也不想用深拷貝,怎么辦?
別急,append和 [:] 組合服用就能夠達到深拷貝deepcopy的效果啦 ===>看

X = [['我','幾','維','度'],['我','是','第','二','維','度'],['我','不','說']]
Y= X  # 直接賦值(淺拷貝)
Z = X [:] # 淺拷貝 
P = copy.copy(X)  # 淺拷貝 
K = copy.deepcopy(X)  # 深拷貝 
TT = []
for i in X:
    TT.append(i[:]) # 我是騷操作

#修改第二維度信息
X[1].append('哈哈')
X[1][1] = '不是'

#我們打印一下結果瞧一瞧
print("起始列表X為 : ", X)
print("把X列表賦值給Y為 : ", Y)
print("淺拷貝X列表給Z為 : ", Z)
print("淺拷貝X列表給P為 : ", P)
print("深拷貝X列表給K為 : ", K)
print("騷操作X列表給TT為 : ", TT)

輸出結果為:

起始列表X為 :  [['我', '幾', '維', '度'], ['我', '不是', '第', '二', '維', '度', '哈哈'], ['我', '不', '說']]
把X列表賦值給Y為 :  [['我', '幾', '維', '度'], ['我', '不是', '第', '二', '維', '度', '哈哈'], ['我', '不', '說']]
淺拷貝X列表給Z為 :  [['我', '幾', '維', '度'], ['我', '不是', '第', '二', '維', '度', '哈哈'], ['我', '不', '說']]
淺拷貝X列表給P為 :  [['我', '幾', '維', '度'], ['我', '不是', '第', '二', '維', '度', '哈哈'], ['我', '不', '說']]
深拷貝X列表給K為 :  **[['我', '幾', '維', '度'], ['我', '是', '第', '二', '維', '度'], ['我', '不', '說']]
騷操作X列表給TT為 :  **[['我', '幾', '維', '度'], ['我', '是', '第', '二', '維', '度'], ['我',
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • python
    +關注

    關注

    56

    文章

    4782

    瀏覽量

    84461
  • 數組
    +關注

    關注

    1

    文章

    416

    瀏覽量

    25910
收藏 人收藏

    評論

    相關推薦

    拷貝拷貝的實現方法概述

    拷貝拷貝的實現
    發表于 07-19 13:35

    python深淺拷貝是什么?

    python的直接賦值python拷貝python
    發表于 11-04 08:33

    請問哪位大神可以詳細介紹JavaScript拷貝拷貝

    JavaScript數據類型JavaScript拷貝拷貝
    發表于 11-05 07:16

    光盤拷貝機的使用端口

    光盤拷貝機的使用端口              使用端口指的是:光盤拷貝機內部控制器與刻錄機相連的接口。目前光盤拷貝
    發表于 12-30 10:04 ?992次閱讀

    磁盤拷貝機的顯示方式/操作方式

    磁盤拷貝機的顯示方式/操作方式
    發表于 12-30 10:31 ?746次閱讀

    C#拷貝拷貝區別解析

     所謂拷貝就是將對象的所有字段復制到新的副本對象拷貝對于值類型與引用類型的方式有區別,
    發表于 11-29 08:32 ?2.6w次閱讀
    C#<b class='flag-5'>淺</b><b class='flag-5'>拷貝</b>與<b class='flag-5'>深</b><b class='flag-5'>拷貝</b>區別解析

    Python如何防止數據被修改Python拷貝拷貝的問題說明

    在平時工作,經常涉及到數據的傳遞。在數據傳遞使用過程,可能會發生數據被修改的問題。為了防止數據被修改,就需要再傳遞一個副本,即使副本被修改,也不會影響原數據的使用。為了生成這個副本,就產生了拷貝——今天就說一下
    的頭像 發表于 03-30 09:54 ?3035次閱讀
    <b class='flag-5'>Python</b>如何防止數據被修改<b class='flag-5'>Python</b><b class='flag-5'>中</b>的<b class='flag-5'>深</b><b class='flag-5'>拷貝</b>與<b class='flag-5'>淺</b><b class='flag-5'>拷貝</b>的問題說明

    實例介紹Python深淺拷貝

    拷貝。今天就說一下Python的深淺拷貝問題。 一、深淺copy 賦值運算 注意:l2 = l1是一個指向,是賦值,和深淺copy無關。
    的頭像 發表于 12-16 11:34 ?1284次閱讀

    C++之拷貝構造函數的copy及copy

    C++編譯器會默認提供構造函數;無參構造函數用于定義對象的默認初始化狀態;拷貝構造函數在創建對象時拷貝對象的狀態;對象的拷貝拷貝
    的頭像 發表于 12-24 15:31 ?712次閱讀

    簡述Python深淺拷貝(copy)

    就說一下Python的深淺拷貝問題。 一、深淺copy 賦值運算 l1 = [1, 2, 3, [22, 33]]l2 = l1l1.append(666)print(l1) # [1, 2, 3
    的頭像 發表于 07-29 16:55 ?1563次閱讀
    簡述<b class='flag-5'>Python</b><b class='flag-5'>中</b>深淺<b class='flag-5'>拷貝</b>(copy)

    C++面向對象編程拷貝拷貝

    可能對于Java程序員來說,很少遇到深淺拷貝問題,但是對于C++程序員來說可謂是又愛又恨。。
    的頭像 發表于 03-30 12:53 ?748次閱讀
    C++面向對象編程<b class='flag-5'>中</b>的<b class='flag-5'>深</b><b class='flag-5'>拷貝</b>和<b class='flag-5'>淺</b><b class='flag-5'>拷貝</b>

    C++拷貝拷貝詳解

    當類的函數成員存在指針成員時會產生拷貝拷貝和問題。
    發表于 08-21 15:05 ?319次閱讀
    C++<b class='flag-5'>深</b><b class='flag-5'>拷貝</b>和<b class='flag-5'>淺</b><b class='flag-5'>拷貝</b>詳解

    什么是拷貝拷貝

    1、創建對象的5種方式 ①、通過 new 關鍵字 這是最常用的一種方式,通過 new 關鍵字調用類的有參或無參構造方法來創建對象。比如 Object obj = new Object(); ②、通過 Class 類的 newInstance() 方法 這種默認是調用類的無參構造方法創建對象。比如 Person p2 = (Person) Class.forName("com.ys.test.Person").newInstance(); ③、通過 Constructor 類的 newInstance 方法 這和第二種方法類都是通過反射來實現。通過 java.lang.relect.Constructor 類的 newInstance() 方法指定某個構造器來創建對象。 Perso
    的頭像 發表于 10-13 11:29 ?655次閱讀
    什么是<b class='flag-5'>深</b><b class='flag-5'>拷貝</b>和<b class='flag-5'>淺</b><b class='flag-5'>拷貝</b>

    什么是零拷貝技術

    在傳統操作系統的數據傳輸過程,系統內部會在磁盤、內存、緩存多次進行數據拷貝,每次都會占用CPU的資源,數據量小的時候還好。 隨著數據量的增加,CPU的開銷也會持續增加,尤其是在機器
    的頭像 發表于 11-27 16:20 ?435次閱讀
    什么是零<b class='flag-5'>拷貝</b>技術

    磁盤拷貝機會拷貝刪除的內容嗎

    磁盤拷貝機,也稱為硬盤克隆器或磁盤復制器,是一種用于復制硬盤驅動器內容的設備。它可以將一個硬盤上的所有數據,包括操作系統、程序、文件和設置,復制到另一個硬盤上。這種設備在數據備份、系統遷移、硬盤
    的頭像 發表于 10-14 15:38 ?280次閱讀