python深淺拷貝

python深淺拷貝

1、引言

在python中,對象賦值其實是對象的引用。當建立一個對象,而後把他賦值給另一個變量的時候,python並無拷貝這個對象,而是拷貝了這個對象的引用。app

針對列表l1=['a','b','c',['d','e','f']]通常有三種方法,分別爲:拷貝(賦值)、淺拷貝、深拷貝。code

注意:==拷貝、淺拷貝、深拷貝都是針對可變類型數據而言的==對象

1.1 可變 or 不可變

id 不變值可變,即在原理的基礎上修改,則爲可變數據類型;值變id也變,即重新申請一個空間放入新值,則爲不可變的數據類型。blog

age = 19
print('first:',id(age))
age = 20
print('second:',id(age))

#輸出:
first: 140731004973888
second: 140731004973920
x = 10
y = 20
print('x:', id(x), 'y', id(y))
x, y = y, x
print('x:', id(x), 'y', id(y))


#輸出:
x: 140731004973600 y 140731004973920
x: 140731004973920 y 140731004973600

2、拷貝

若是l2是l1的拷貝對象,則l1內部的任何數據類型的元素變化,則l2內部的元素也會跟着變化,由於可變類型值變id不變。it

l1 = ['a','b','c',['d','e','f']]
l2 = l1
l1.append('g')

print(l1)


#輸出:
['a', 'b', 'c', ['d', 'e', 'f'], 'g']

print(l2)
#輸出 :
['a', 'b', 'c', ['d', 'e', 'f'], 'g']

3、淺拷貝

若是l2是l1的淺拷貝對象,則l1內的不可變元素髮生了改變,l2不變。若是l1內的可變元素髮生l改變,則l2會跟着改變。class

import copy
l1 = ['a','b','c',['d','e','f']]
l2 = copy.copy(l1)

l1.append('g')

print(l1)
#輸出:
['a', 'b', 'c', ['d', 'e', 'f'], 'g']

print(l2)
#輸出:
['a', 'b', 'c', ['d', 'e', 'f']]

l1[3].append('g')

print(l1)
#輸出:
['a', 'b', 'c', ['d', 'e', 'f', 'g'], 'g']

print(l2)
#輸出:
['a', 'b', 'c', ['d', 'e', 'f', 'g']]

4、深拷貝

若是l2 是l1 的深拷貝對象,則l1內的不可變元素髮生了改變,l2不變。import

若是l1內的可變元素髮生了改變,l2也不會改變,即l2 是永遠不會由於l1 的變化而變化的。基礎

import copy
l1 = ['a','b','c',['d','e','f']]
l2 = copy.deepcopy(l1)

l1.append('g')

print(l1)
#輸出:
['a', 'b', 'c', ['d', 'e', 'f'], 'g']

print(l2)
#輸出:
['a', 'b', 'c', ['d', 'e', 'f']]

l1[3].append('g')

print(l1)
#輸出:
['a', 'b', 'c', ['d', 'e', 'f', 'g'], 'g']

print(l2)
#輸出:
['a', 'b', 'c', ['d', 'e', 'f']]

總結

  • 牢記: 拷貝/淺拷貝/深拷貝 只針對可變數據類型
  • 拷貝: 當lt2爲lt的拷貝對象時,lt內的可變類型變化,lt2變化;lt內的不可變類型變化,lt2變化,拷貝就是簡單的賦值
  • 淺拷貝:當lt2爲lt的淺拷貝對象時,lt內的可變類型變化,lt2變化;lt內的不可變類型變化,lt2不變化,實現用copy.copy() 可變數據的類型中的內置方法.copy()
  • 深拷貝: 當lt2爲lt的深拷貝對象時,lt內的可變類型變化,lt2不變化;lt內的不可變類型變化,lt2不變
相關文章
相關標籤/搜索