python的深賦值與淺賦值

2021-10-02 10:54:11 字數 1653 閱讀 4751

原文

在python中,物件賦值實際上是物件的的引用,當建立乙個物件,然後把它賦值給另外乙個變數的時候,python沒有拷貝這個物件,而只是拷貝了這個物件的引用,所以就出現了淺複製,即複製後原物件改變後,複製出來的物件也會改變,要防止複製出來的物件改變,就要使用深複製

python複製三種方式

(1)使用「=」直接賦值,傳遞物件的引用而已。原始列表改變,被賦值的物件也會做相同改變

# b = a

list1 =[1

,2,'1',[

4,'2']

]list2= list1

print

(list1)

# [1, 2, '1', [4, '2']]

print

(list2)

# [1, 2, '1', [4, '2']]5)

# 雖然僅僅對列表1操作,但是列表2跟著變化了

print

(list1)

# [1, 2, '1', [4, '2'], 5]

print

(list2)

# [1, 2, '1', [4, '2'], 5]

(2)copy淺複製,沒有拷貝子物件,所以原始資料改變,子物件也會發生變化

注:copy淺複製與list[:]效果一致

import copy

list1 =[1

,2,'1',[

4,'2']

]list2 = copy.copy(list1)

print

(list2)

# [1, 2, '1', [4, '2']]

list3 = list1[:]

print

(list3)

# [1, 2, '1', [4, '2']]

'c')

list1[3]

5)print

(list1)

# [1, 2, '1', [4, '2', 5], 'c']

print

(list2)

# [1, 2, '1', [4, '2', 5]]

print

(list3)

# [1, 2, '1', [4, '2', 5]]

(3)深拷貝,包含物件裡面的自物件的拷貝,所以原始物件的改變不會造成深拷貝裡任何子元素的改變

import copy

list1 =[1

,2,'1',[

4,'2']

]list2 = copy.deepcopy(list1)

print

(list2)

# [1, 2, '1', [4, '2']]

'c')

list1[3]

5)print

(list1)

# [1, 2, '1', [4, '2', 5], 'c']

print

(list2)

# [1, 2, '1', [4, '2']]

綜上,使用「=」賦值相當於引用,賦值前後的變數其實是一樣的,而使用deepcopy,則只是賦值了當時的資料,後續不會變化。

淺拷貝 深拷貝和淺賦值 深賦值

include includeusing namespace std class string else 淺拷貝 也就是系統預設的拷貝,可寫可不寫。string const string s 預設的拷貝構造 深拷貝 string const string s string s2 s1 深賦值 str...

python的賦值 深拷貝與淺拷貝

a 1,2,3,6,45,12,56,69 b aprint a print b print 這是一段賦值 輸出結果 e install python3.7.3 python.exe f pycharm workspace day01 copydemo.py 1,2,3,6,45,12,56,69,...

Python 賦值 淺拷貝 深拷貝

賦值 a b,只拷貝了物件的引用,沒有拷貝內容。兩個物件的id一樣 淺拷貝 copy.copy 構造乙個新的復合物件,然後將子物件引用插入到原始物件的副本中。深拷貝 copy.deepcopy 構造乙個新的復合物件,然後遞迴地將子物件副本插入原始物件的副本。給個栗子 從這個栗子可以看出,對c進行修改...