python中的拷貝

2021-09-22 20:14:56 字數 1364 閱讀 5409

1.賦值: 只是複製了新物件的引用,不會開闢新的記憶體空間。

2.淺拷貝: 建立新物件,其內容是原物件的引用。

淺拷貝有三種形式:切片操作,工廠函式,copy模組中的copy函式。

如: lst = [1,2,3,[4,5]] 

切片操作:lst1 = lst[:] 或者 lst1 = [each for each in lst]  要注意:list1=lst 和list1=lst[:]的區別

工廠函式:lst1 = list(lst)

copy函式:lst1 = copy.copy(lst)

淺拷貝之所以稱為淺拷貝,是它僅僅只拷貝了一層,在lst中有乙個巢狀的list[4,5],如果我們修改了它,情況就不一樣了。

3.深拷貝:只有一種形式,copy模組中的deepcopy函式。

和淺拷貝對應,深拷貝拷貝了物件的所有元素,包括多層巢狀的元素。

深拷貝出來的物件是乙個全新的物件,不再與原來的物件有任何關聯。

import copy

a = [1, 2, 3, 4, ['a', 'b']] #定義乙個列表a

b = a #賦值

c = copy.copy(a) #淺拷貝

# c = a[:]

d = copy.deepcopy(a) #深拷貝

print(a)

#[1, 2, 3, 4, ['a', 'b'], 5] #a新增乙個元素5

print(b)

#[1, 2, 3, 4, ['a', 'b'], 5] #b跟著新增乙個元素5

print(c)

#[1, 2, 3, 4, ['a', 'b']] #c保持不變

print(d)

#[1, 2, 3, 4, ['a', 'b']] #d保持不變

print(a)

#[1, 2, 3, 4, ['a', 'b', 'c'], 5] #a中的list(即a[4])新增乙個元素c

print(b)

#[1, 2, 3, 4, ['a', 'b', 'c'], 5] #b跟著新增乙個元素c

print(c)

#[1, 2, 3, 4, ['a', 'b', 'c']] #c跟著新增乙個元素c

print(d)

#[1, 2, 3, 4, ['a', 'b']] #d保持不變

#說明如下:

#1.外層新增元素時, 淺拷貝c不會隨原列表a變化而變化;內層list新增元素時,淺拷貝c才會變化。

#2.無論原列表a如何變化,深拷貝d都保持不變。

#3.賦值物件隨著原列表一起變化

參考:

(1). (python中的賦值(複製)、淺拷貝、深拷貝之間的區別

(2).的複製,深拷貝和淺拷貝的區別)

python中的拷貝

再說拷貝之前先說一說 is 與 is 的作用是 比較兩個引用是否為乙個位址 是比較兩個值 a和b中實際儲存的就是一條位址,因為都賦值為2,所以就都存了記憶體單元中2的位址。也就是說如果增加乙個變數c 另c a或c b,那麼c也指向的是2的記憶體位址 接下來說拷貝,拷貝與 賦值不同,拷貝是在建立乙個空...

python淺拷貝 Python中的淺拷貝和深拷貝

在python中,賦值語句不複製物件,它們只是在目標和物件之間建立繫結。當我們使用 運算子時,使用者認為這會建立乙個新物件 好吧,其實並沒有。它只建立乙個共享原始物件引用的新變數。有時使用者想要使用可變物件,為了做到這一點,使用者希望找到建立這些物件的 真實副本 或 轉殖 的方法。或者,有時使用者想...

Python中的拷貝與深淺拷貝

即為賦值.舉個例子 a 147147 b a 賦值 print a is b true 對於淺拷貝,字典 列表 元組等型別,它們只拷貝第一層位址 import copy n1 n3 copy.copy n1 淺拷貝 print id n1 print id n3 print id n1 k3 pri...