Python基礎(chǔ)之賦值,淺拷貝,深拷貝的區(qū)別
一、賦值
不會(huì)開辟新的內(nèi)存空間,只是復(fù)制了新對(duì)象的引用。所以當(dāng)一個(gè)數(shù)據(jù)發(fā)生變化時(shí),另外一個(gè)數(shù)據(jù)也會(huì)隨之改變。
二、淺拷貝
創(chuàng)建新對(duì)象,其內(nèi)容是對(duì)原對(duì)象的引用。淺拷貝之所以稱為淺拷貝,是因?yàn)樗鼉H僅只拷貝了第一層,即只拷貝了最外層的對(duì)象本身,內(nèi)部的元素都只是拷貝了一個(gè)引用而已,即內(nèi)部元素如果被修改,則另外一個(gè)數(shù)據(jù)也會(huì)發(fā)生變化。
淺拷貝的三種形式:
A = [1, 2, 3, 4]
- 切片操作
# 第1種 B = A[:] # 第2種 B = [a for a in A]
- 工廠函數(shù)
B = list(A)
- copy函數(shù)
B = copy.copy(A)
淺拷貝要分兩種情況進(jìn)行討論:
1)當(dāng)淺拷貝的值是不可變對(duì)象(例如字符串、元組、數(shù)值類型)時(shí),和賦值情況一樣,對(duì)象的內(nèi)存地址(id())與淺拷貝原來的值一致。
2)當(dāng)淺拷貝的值是可變對(duì)象(例如列表、字典、集合等)時(shí),也需要分兩種情況討論:
首先,原來值的內(nèi)存地址與拷貝后的內(nèi)存地址不同。
- 當(dāng)要拷貝的對(duì)象里面,沒有可變的子對(duì)象時(shí),原來值(拷貝值)的改變并不會(huì)影響拷貝值(原來值)。
- 當(dāng)要拷貝的對(duì)象里面,有可以改變的子對(duì)象時(shí),改變?cè)撟訉?duì)象,原來值和拷貝值之間會(huì)互相影響。
三、深拷貝
深拷貝拷貝出來的對(duì)象是一個(gè)全新的對(duì)象,和原來的對(duì)象沒有任何的關(guān)聯(lián)。改變?cè)袑?duì)象不會(huì)影響新的拷貝對(duì)象。
四、例子
- 不可變對(duì)象
import copy # 不可變對(duì)象 # A = (1, 2, 'hello') # 元組 # A = 1 # 數(shù)值 A = 'hello' # 字符串 print("********賦值********") B = A print(id(A)) print(id(B)) print(A) print(B) print("********淺拷貝********") B = copy.copy(A) print(id(A)) print(id(B)) print(A) print(B) print("********深拷貝********") B = copy.deepcopy(A) print(id(A)) print(id(B)) print(A) print(B)
結(jié)果:
********賦值********
1894005658264
1894005658264
hello
hello
********淺拷貝********
1894005658264
1894005658264
hello
hello
********深拷貝********
1894005658264
1894005658264
hello
hello
- 可變對(duì)象
import copy # 可變對(duì)象 A = [1, 2, 3] print("********賦值********") B = A print(id(A)) print(id(B)) print(A) print(B) print("********淺拷貝********") B = copy.copy(A) print(id(A)) print(id(B)) print(A) print(B) print("********深拷貝********") B = copy.deepcopy(A) print(id(A)) print(id(B)) print(A) print(B)
結(jié)果:
********賦值********
1602694308360
1602694308360
[1, 2, 3]
[1, 2, 3]
********淺拷貝********
1602694308360
1602694308424
[1, 2, 3]
[1, 2, 3]
********深拷貝********
1602694308360
1602950316296
[1, 2, 3]
[1, 2, 3]
- 可變對(duì)象修改外層
import copy # 可變對(duì)象 A = [1, 2, 3, [11, 10, 20]] # 可變對(duì)象的外層修改 B1 = A # 賦值 B2 = copy.copy(A) # 淺拷貝 B3 = copy.deepcopy(A) # 深拷貝 A.append(4) print("********賦值********") print(id(A)) print(id(B1)) print(A) print(B1) print("********淺拷貝********") print(id(A)) print(id(B2)) print(A) print(B2) print("********深拷貝********") print(id(A)) print(id(B3)) print(A) print(B3)
結(jié)果:
********賦值********
2215309238856
2215309238856
[1, 2, 3, [11, 10, 20], 4]
[1, 2, 3, [11, 10, 20], 4]
********淺拷貝********
2215309238856
2215593496776
[1, 2, 3, [11, 10, 20], 4]
[1, 2, 3, [11, 10, 20]]
********深拷貝********
2215309238856
2215593518024
[1, 2, 3, [11, 10, 20], 4]
[1, 2, 3, [11, 10, 20]]
- 可變對(duì)象修改內(nèi)層
import copy # 可變對(duì)象 A = [1, 2, 3, [11, 10, 20]] # 可變對(duì)象的內(nèi)層修改 B1 = A # 賦值 B2 = copy.copy(A) # 淺拷貝 B3 = copy.deepcopy(A) # 深拷貝 A[3].append(4) print("********賦值********") print(id(A)) print(id(B1)) print(A) print(B1) print("********淺拷貝********") print(id(A)) print(id(B2)) print(A) print(B2) print("********深拷貝********") print(id(A)) print(id(B3)) print(A) print(B3)
結(jié)果
********賦值********
2288591069768
2288591069768
[1, 2, 3, [11, 10, 20, 4]]
[1, 2, 3, [11, 10, 20, 4]]
********淺拷貝********
2288591069768
2288847138760
[1, 2, 3, [11, 10, 20, 4]]
[1, 2, 3, [11, 10, 20, 4]]
********深拷貝********
2288591069768
2288847168264
[1, 2, 3, [11, 10, 20, 4]]
[1, 2, 3, [11, 10, 20]]
到此這篇關(guān)于Python基礎(chǔ)之賦值,淺拷貝,深拷貝的區(qū)別的文章就介紹到這了,更多相關(guān)Python賦值 淺拷貝 深拷貝的區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python中關(guān)于?*args與**args的用法及說明
這篇文章主要介紹了Python中關(guān)于?*args與**args的用法及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02python對(duì)視頻畫框標(biāo)記后保存的方法
今天小編就為大家分享一篇python對(duì)視頻畫框標(biāo)記后保存的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-12-12Python在報(bào)表自動(dòng)化的優(yōu)勢及實(shí)現(xiàn)流程
本文利用Python實(shí)現(xiàn)報(bào)表自動(dòng)化,通過介紹環(huán)境設(shè)置、數(shù)據(jù)收集和準(zhǔn)備、報(bào)表生成以及自動(dòng)化流程,展示Python的靈活性和豐富的生態(tài)系統(tǒng)在報(bào)表自動(dòng)化中的卓越表現(xiàn),從設(shè)置虛擬環(huán)境到使用Pandas和Matplotlib處理數(shù)據(jù),到借助APScheduler實(shí)現(xiàn)定期自動(dòng)化,每個(gè)步驟都得到詳盡闡述2023-12-12Django集成Celery實(shí)現(xiàn)高效的異步任務(wù)處理的全過程
Django?作為一個(gè)強(qiáng)大的?Python?Web?框架,可以通過集成?Celery?這一異步任務(wù)隊(duì)列來優(yōu)化這些任務(wù)的處理,本文將深入探討如何在?Django?項(xiàng)目中集成?Celery,包括?Celery?的基本配置、定義任務(wù)、以及監(jiān)控任務(wù)執(zhí)行,需要的朋友可以參考下2023-11-11