python淺拷貝與深拷貝使用方法詳解
淺拷貝和深拷貝在面試和日常的開發(fā)中都會(huì)經(jīng)常遇到
我們就從 對(duì)象賦值、淺拷貝、深拷貝 三個(gè)方面來講
一、對(duì)象賦值
In [1]: list1 = [1, 2, ['a', 'b']] list2 = list1 print(list1) print(list2) [1, 2, ['a', 'b']] [1, 2, ['a', 'b']] In [2]: list1[0] = 3 print(list1) print(list2) [3, 2, ['a', 'b']] [3, 2, ['a', 'b']] In [3]: list2[1]=[1,2] print(list1) print(list2) [3, [1, 2], ['a', 'b']] [3, [1, 2], ['a', 'b']] In [4]: print(id(list1)) print(id(list2)) 1742901832264 1742901832264
結(jié)論:直接對(duì)象賦值,兩個(gè)對(duì)象的地址是一樣的,也就是這兩個(gè)變量指向是同一個(gè)對(duì)象,兩個(gè)變量會(huì)同步變化
二、淺拷貝
In [5]:
import copy
A = [1, 'a', ['a', 'b']]
# B = A.copy() # 淺拷貝
B = copy.copy(A) # 淺拷貝
print(A)
print(B)
print(id(A))
print(id(B))
[1, 'a', ['a', 'b']]
[1, 'a', ['a', 'b']]
1742901926344
1742901925512
兩個(gè)對(duì)象的內(nèi)存地址不一樣,也就是不是同一個(gè)對(duì)象
In [6]:
# 循環(huán)分別打印每個(gè)對(duì)象中的成員的地址
# 打印A
for i in A:
print("值 {} 的地址是:{}".format(i,id(i)))
值 1 的地址是:140724000563600
值 a 的地址是:1742860054320
值 ['a', 'b'] 的地址是:1742901889800
In [7]:
# 循環(huán)分別打印每個(gè)對(duì)象中的成員的地址
# 打印B
for i in B:
print("值 {} 的地址是:{}".format(i,id(i)))
值 1 的地址是:140724000563600
值 a 的地址是:1742860054320
值 ['a', 'b'] 的地址是:1742901889800int類型的1和字符串型的a都是不可變數(shù)據(jù)類型,不可變數(shù)據(jù)類型值一樣,地址一樣,值不一樣,地址就不一樣
列表[‘a’, ‘b’]是可變數(shù)據(jù)類型,可變數(shù)據(jù)類型是 變量中數(shù)據(jù)變的時(shí)候,地址不會(huì)變,值相同的兩個(gè)對(duì)象,地址是不一樣的,如果地址一樣,表示指的是同一個(gè)對(duì)象
現(xiàn)在 A[2] 和 B[2] 指向的是同一個(gè)地址,說明是同一個(gè)列表,一個(gè)改變,另外的一個(gè)也會(huì)同步改變
通常來講不可變?cè)匕?/p>
int,float,complex,long,str,unicode,tuple
In [8]: # 在 A[2] 中增加元素 A[2].append(3) print(A) print(B) [1, 'a', ['a', 'b', 3]] [1, 'a', ['a', 'b', 3]] In [9]: # 向A中增加元素 A.append(3) print(A) print(B) [1, 'a', ['a', 'b', 3], 3] [1, 'a', ['a', 'b', 3]] In [10]: A[0]=2 print(A) print(B) [2, 'a', ['a', 'b', 3], 3] [1, 'a', ['a', 'b', 3]]
淺拷貝(copy.copy()):拷貝父對(duì)象,不會(huì)拷貝對(duì)象的內(nèi)部的子對(duì)象,也就是子對(duì)象共用
如果子對(duì)象是不可變數(shù)據(jù)類型,那么復(fù)制的對(duì)象和原來的對(duì)象互不影響
如果是可變數(shù)據(jù)類型,那么復(fù)制的對(duì)象和原來的對(duì)象共用
In [11]: A[2]=[1,2] print(A) print(B) [2, 'a', [1, 2], 3] [1, 'a', ['a', 'b', 3]] In [12]: print(id(A[2])) print(id(B[2])) 1742901889416 1742901889800
可以看到 現(xiàn)在 A[2] 和 B[2] 的地址不一樣了,那么他們就互不影響了
其實(shí)看兩個(gè)可變數(shù)據(jù)類型是否互相影響,就是看他們的地址是否一樣
三、深拷貝
In [13]:
m = [1, 'a', ['a', 'b']]
n = copy.deepcopy(m)
print(m)
print(n)
print(id(m))
print(id(n))
[1, 'a', ['a', 'b']]
[1, 'a', ['a', 'b']]
1742900283720
1742900260680
In [14]:
# 循環(huán)分別打印每個(gè)對(duì)象中的成員的地址
# 打印m
for i in m:
print("值 {} 的地址是:{}".format(i,id(i)))
值 1 的地址是:140724000563600
值 a 的地址是:1742860054320
值 ['a', 'b'] 的地址是:1742900341320
In [15]:
# 循環(huán)分別打印每個(gè)對(duì)象中的成員的地址
# 打印n
for i in n:
print("值 {} 的地址是:{}".format(i,id(i)))
值 1 的地址是:140724000563600
值 a 的地址是:1742860054320
值 ['a', 'b'] 的地址是:1742900283208可以看到,m和n兩個(gè)對(duì)象本身的地址是不一樣的,
并且m和n中成員中的可變數(shù)據(jù)類型的地址也是不一樣的,所以它們兩個(gè)是完全互不影響的
''' 學(xué)習(xí)中遇到問題沒人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流群:711312441 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書! ''' In [16]: m[2].append(3) n[1]=5 print(m) print(n) [1, 'a', ['a', 'b', 3]] [1, 5, ['a', 'b']]
淺拷貝(copy.copy()):拷貝父對(duì)象,不會(huì)拷貝對(duì)象的內(nèi)部的子對(duì)象,也就是子對(duì)象共用
- 如果子對(duì)象是不可變數(shù)據(jù)類型,那么復(fù)制的對(duì)象和原來的對(duì)象互不影響
- 如果是可變數(shù)據(jù)類型,那么復(fù)制的對(duì)象和原來的對(duì)象共用
深拷貝(copy.deepcopy()):完全拷貝父對(duì)象跟子對(duì)象,復(fù)制的對(duì)象和原來的對(duì)象互不相關(guān)
四、深入解析
1、b = a.copy(): 淺拷貝, a 和 b 是一個(gè)獨(dú)立的對(duì)象,但他們的子對(duì)象還是指向統(tǒng)一對(duì)象(是引用)。

2、b = copy.deepcopy(a): 深度拷貝, a 和 b 完全拷貝了父對(duì)象及其子對(duì)象,兩者是完全獨(dú)立的。

到此這篇關(guān)于python淺拷貝與深拷貝使用方法詳解的文章就介紹到這了,更多相關(guān)python淺拷貝與深拷貝內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解python中return和print的區(qū)別和用途
在 Python 中,return 和 print 是兩種常見的語句,用于在函數(shù)中輸出信息或返回值,盡管它們看起來相似,但它們有不同的作用和用法,本文將詳細(xì)介紹 return 和 print 在函數(shù)中的區(qū)別,并提供豐富的示例代碼,以幫助你更好地理解它們的用途2023-11-11
利用Python實(shí)現(xiàn)Excel的文件間的數(shù)據(jù)匹配功能
這篇文章主要介紹了利用Python實(shí)現(xiàn)Excel的文件間的數(shù)據(jù)匹配,本文通過一個(gè)函數(shù)實(shí)現(xiàn)此功能,通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
YOLOv5車牌識(shí)別實(shí)戰(zhàn)教程(八)Web應(yīng)用與API開發(fā)
這篇文章主要介紹了YOLOv5車牌識(shí)別實(shí)戰(zhàn)教程(八)Web應(yīng)用與API開發(fā),在這個(gè)教程中,我們將一步步教你如何使用YOLOv5進(jìn)行車牌識(shí)別,幫助你快速掌握YOLOv5車牌識(shí)別技能,需要的朋友可以參考下2023-04-04
python讀取excel指定列數(shù)據(jù)并寫入到新的excel方法
今天小編就為大家分享一篇python讀取excel指定列數(shù)據(jù)并寫入到新的excel方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07
Python深度強(qiáng)化學(xué)習(xí)之DQN算法原理詳解
DQN算法是DeepMind團(tuán)隊(duì)提出的一種深度強(qiáng)化學(xué)習(xí)算法,在許多電動(dòng)游戲中達(dá)到人類玩家甚至超越人類玩家的水準(zhǔn),本文就帶領(lǐng)大家了解一下這個(gè)算法,快來跟隨小編學(xué)習(xí)一下2021-12-12
Python實(shí)現(xiàn)的旋轉(zhuǎn)數(shù)組功能算法示例
這篇文章主要介紹了Python實(shí)現(xiàn)的旋轉(zhuǎn)數(shù)組功能算法,結(jié)合實(shí)例形式總結(jié)分析了數(shù)組旋轉(zhuǎn)算法的原理與實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-02-02
pygame實(shí)現(xiàn)飛機(jī)大戰(zhàn)
這篇文章主要為大家詳細(xì)介紹了pygame實(shí)現(xiàn)飛機(jī)大戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03

