目的:我想要的是把對象完全復制一遍放在一個新的內存單元中,二者相互獨立。
賦值(=)與復制(copy)在c++里面是一致的的,在Python里面似乎不同。先說說賦值(=),如a=[1, 2, 3]
。這句話是什么意思呢,可以理解為把 [1, 2, 3] 看成一個物品。a = [1, 2, 3] 就相當於給這個物品上貼上 a 這個標簽。b = a
就是給這個物品又貼上了一個 b 的標簽。那么其實a和b指向的都是同一個地址,這個地址的內容是[1, 2, 3]
,改變其中一個就會影響另一個。這與我的目的不符。
a=[1,2,3] #等號賦值相當於把a的地址賦給了b,現在a和b一起指向【1,2,3】這個列表
b=a
id(a) == id(b)) #ture,id()函數獲得內存地址,二者地址相同
#—————————————因為指向相同,修改其中一個的內容就會影響另一個內容,a,b都會改變—————————————————————
a[0]=7
print(a) #[7, 2, 3]
print(b) #[7, 2, 3]
#如果a又指向了一個新的列表,那么a的地址會變,但b還是指向原本的列表
a=[4,5,6]
print(a) #[4, 5, 6]
print(b) #[7, 2, 3]
id(a) == id(b)) #FALSE,二者的地址已經不再相同了
a = [4, 5, 6] 就相當於把 a 標簽從 [7 ,2, 3] 上撕下來,貼到了 [4, 5, 6] 上,a的地址改變了。在這個過程中,[7, 2, 3] 這個物品並沒有消失。 b 自始至終都好好的貼在 [7, 2, 3] 上,所以 b 的地址自然不變。
復制(copy)一般指深復制,即將被復制對象完全再復制一遍作為獨立的新個體單獨存在。所以改變原有被復制對象不會對已經復制出來的新對象產生影響。
a=[1,2,3]
b=copy.copy(a) #copy進行復制后為兩個獨立的對象
id(a) == id(b)) #FALSE,a b是兩個獨立的對象,有自己的內存空間。他們的地址已經不再相同了
a[0]=10 #這時改變a,是不會影響b的
print(a) #[10, 2, 3]
print(b) #[1, 2, 3]
我理解的copy就是把對象完全復制一遍放在一個新的內存單元中,你可以對復制后的東西任意操作而不會影響原對象