python直接賦值 深拷貝和淺拷貝

2021-08-28 13:01:19 字數 955 閱讀 4263

python中,物件賦值實際上是物件的引用。當建立乙個物件,將其賦值給另乙個變數,python並沒有拷貝這個物件,而是拷貝了這個物件的引用。 所以如果從單純的賦值語句來實現clone物件的話, 那可能bug出現的也會莫名其妙. python中可以使用copy模組來複製物件.

copy.copy 為淺拷貝, 只copy父物件, 不會拷貝物件內部的子物件。

淺拷貝

copy.deepcopy 深拷貝, 拷貝物件及其子物件。

>>> import copy

>>> a = [1,2,3,4,['a','b']]

>>> b = a # 賦值拷貝

>>> c = copy.copy(a) # 淺拷貝, 只拷貝了a的引用, 內部元素沒有拷貝.

>>> d = copy.deepcopy(a) # 深拷貝, 完全拷貝

>>>

>>>

>>> print 'a=',a

a= [1, 2, 3, 4, ['a', 'b', 'c'], 5]

>>> print 'b=',b

b= [1, 2, 3, 4, ['a', 'b', 'c'], 5] #賦值拷貝, 記憶體位址指向一樣的。 相當於乙個人的兩個名字而已.

>>> print 'c=',c

c= [1, 2, 3, 4, ['a', 'b', 'c']] #淺拷貝, 子元素c[4]引用的位址和a[4]是一樣的. 所以改變a[4]相當於改了c[4].

>>> print 'd=',d

d= [1, 2, 3, 4, ['a', 'b']] #深拷貝完全拷貝. a和d完全改變了.

直接賦值 淺拷貝和深拷貝

我們經常使用的 student s1 newstudent student s2 s1 直接物件賦值,它只是拷貝了物件引用位址而已,並沒有在堆記憶體重新生成乙個新的物件 如下圖 上面的s1和s2引用其實都是指向堆中同乙個student例項位址。所以如果改下s1中的任何成員變數 基本型別或者引用型別 ...

深拷貝 淺拷貝 直接賦值

使用直接賦值後兩個物件就完全一樣,隨著改變乙個物件的值另乙個物件的值也隨之改變。淺拷貝,物件中的值型別互補影響,但是引用型別 string雖然是引用型別但特殊存在類值型別 隨著乙個物件的值改變另乙個也會改變。深拷貝,兩個物件完全獨立互補影響 1 class program212 13 1415 pu...

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

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