Python的賦值,深拷貝和淺拷貝的區別


在python中,對象賦值實際上是對象的引用。當創建一個對象,然后把它賦給另一個變量的時候,python並沒有拷貝這個對象,而只是拷貝了這個對象的引用

一般有三種方法,

alist=[1,2,3,['a','b']]

(1)直接賦值,傳遞對象的引用而已,原始列表改變,被賦值的b也會做相同的改變

alist = [1,2,3,['a','b']]
b = alist
print(b)
#[1, 2, 3, ['a', 'b']]
alist.append(5)
print(alist),print(b)
#[1, 2, 3, ['a', 'b'], 5]
#[1, 2, 3, ['a', 'b'], 5]

(2)copy淺拷貝,沒有拷貝子對象,所以原始數據改變,子對象會改變

alist=[1, 2, 3, ['a', 'b'], 5]

import copy
c = copy.copy(alist)
print(alist),print(c)
#[1, 2, 3, ['a', 'b'], 5]
#[1, 2, 3, ['a', 'b'], 5]
alist.append(6)
print(alist),print(c)
#[1, 2, 3, ['a', 'b'], 5,6]
#[1, 2, 3, ['a', 'b'], 5]
alist.append('Python')
print(alist),print(c)
#[1, 2, 3, ['a', 'b'], 5,6,'Python']
#[1, 2, 3, ['a', 'b'], 5]
print(alist[3])
#['a', 'b']
alist[3].append('Python')
print(alist),print(c)
#[1, 2, 3, ['a', 'b', 'Python'], 5, 6, 'Python']
#[1, 2, 3, ['a', 'b', 'Python'], 5]

alist子對象被改變了

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

import copy
alist = [1,2,3,['a','b']]
d = copy.deepcopy(alist)
print(alist),print(d)
#[1, 2, 3, ['a', 'b']]
#[1, 2, 3, ['a', 'b']]
#沒有改變
alist.append(5)
print(alist),print(d)
#[1, 2, 3, ['a', 'b'], 5]
#[1, 2, 3, ['a', 'b']]
#沒有改變
alist = [1,2,3,['a','b']]
print(alist[3])
#['a', 'b']
alist[3].append('Python')
print(alist),print(d)
#[1, 2, 3, ['a', 'b', 'Python']]
#[1, 2, 3, ['a', 'b']]
#沒有改變

總結:

1. 賦值是將一個對象的地址賦值給一個變量,讓變量指向該地址( 舊瓶裝舊酒 )。

2. 淺拷貝是在另一塊地址中創建一個新的變量或容器,但是容器內的元素的地址均是源對象的元素的地址的拷貝。也就是說新的容器中指向了舊的元素( 新瓶裝舊酒 )。

3. 深拷貝是在另一塊地址中創建一個新的變量或容器,同時容器內的元素的地址也是新開辟的,僅僅是值相同而已,是完全的副本。也就是說( 新瓶裝新酒 )。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM