一、賦值對比
1、列表
l1 = [1,2,3]
l2 = l1
l1.append('a')
pri #[1, 2, 3, 'a'] [1, 2, 3, 'a']
print(id(l1),id(l2)) #43499848 43499848
#可以看到兩個列表的值以及id值相同,對應的是同乙個記憶體位址
2、字典
dic =
dic1 = dic
dic['age'] = 18
print(dic,dic1) #
print(id(dic),id(dic1)) #31157344 31157344
#可以看到兩個字典的值以及id值相同,對應的是同乙個記憶體位址
3、字串
s = 'alex'
s1 = s
s2 = s.replace('a','a')
print(s,s1,s2) #alex alex alex
print(id(s),id(s1),id(s2)) #31040208 310402www.cppcns.com08 31040376
#賦值是同乙個記憶體位址,替換字串後的變數s2是另外的位址
二、深淺copy
1、淺copy
對於淺copy來說,第一層建立的是新的記憶體位址。而從第二層開始,指向的是同乙個記憶體位址,所有,對於第二層以及更深的層數來說,保持一致性。
# 1、普通淺copy
l1 = [1,2,3,4]
l2 = l1.copy()
l1.append('a')
print(l1,l2) #[1, 2, 3, 4, 'a'] [1, 2, 3, 4]
print(id(l1),id(l2)) #37077320 37078664
#id記憶體位址不一樣,建立了兩個位址空間,乙個改變,另乙個不會變化
# 2、osjpa巢狀淺copy
import copy
l1 = [1,[22,33,44],3,4,]
l2 = copy.deepcopwww.cppcns.comy(l1)
# 改變第一層
l1[0] = 111
print(l1,l2) #[111, [22, 33, 44], 3, 4] [1, [22, 33, 44], 3, 4]
print(id(l1),id(l2)) #43238536 43239048
# 改變第二層
l1[1].append('a')
print(l1,l2) # [111, [22, 33, 44, 'a'], 3, 4] [1, [22, 33, 44], 3, 4]
print(id(l1),id(l2)) #43238536 43239048
2、 深copy.deepcopy()
對於深copy來說,兩個是完全獨立的,改變任意乙個的元素(無論是多少層),另乙個絕不會改變。
import copy
l1 = [1,[22,33,44],3,4,]
l2 = copy.deepcopy(l1)
# 改變第一層
l1[0] = 111
print(l1,l2) #[111, [22, 33, 44], 3, 4] [1, [22, 33, 44], 3, 4]
print(id(l1),id(l2)) #43238536 43239048
# 改變第二層
l1[1].append('a')
print(l1,l2) # [111, [22, 33, 44, 'a'], 3, 4] [1, [22, 33, 44], 3, 4]
print(id(l1),id(l2)) #43238536 43239048
本文標題: python3 深淺copy對比詳解
本文位址: /jiaoben/python/267988.html
Python3 深淺拷貝
在python中物件的賦值其實就是物件的引用。當建立乙個物件,把它賦值給另乙個變數的時候,python並沒有拷貝這個物件,只是拷貝了這個物件的引用而已。1,變數 是乙個系統表的元素,擁有指向物件的連線空間。2,物件 被分配的一塊記憶體,儲存其所代表的值。3,引用 是自動形成的從變數到物件的指標。4,...
補充 python深淺copy
name liming lilongfei duanwenchao tangeng 11 yuxiaobin name2 name.copy 淺copy,只copy第一層 print name print name2 name 1 haha 當修改name的第一層時,name2不發生變化 name ...
python 深淺copy總結
總結 總結 假設l1為原資料,l2為deepcopy後的資料 1.淺copy,只能改變第一層的記憶體位址 不可變資料型別除外 2.深copy,能夠改變第一層和第二層的記憶體位址 不可變資料型別除外 3.不可變型別,位址不會發生變化,且不可使用copy 可以使用copy.deepcopy 4.對dee...