目錄python
在python中,對象賦值其實是對象的引用。當建立一個對象,而後把他賦值給另一個變量的時候,python並無拷貝這個對象,而是拷貝了這個對象的引用。app
針對列表l1=['a','b','c',['d','e','f']]
通常有三種方法,分別爲:拷貝(賦值)、淺拷貝、深拷貝。code
注意:==拷貝、淺拷貝、深拷貝都是針對可變類型數據而言的==對象
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
若是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']
若是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']]
若是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']]