一 定義
在Python中對象的賦值其實就是對象的引用。當創建一個對象,把它賦值給另一個變量的時候,python並沒有拷貝這個對象,只是拷貝了這個對象的引用而已。
- 淺拷貝: 淺拷貝值只拷貝一層,具有自己單獨的內存地址,二層或其他層不拷貝,指向原有的內存地址。
- 深拷貝: 就是克隆一份,具有自己單獨的內存地址,兩者完全不相干設。
二 術語
1,變量:是一個系統表的元素,擁有指向對象的連接空間。
2,對象:被分配的一塊內存,存儲其所代表的值。
3,引用:是自動形成的從變量到對象的指針。
4,注意:類型(int類型,long類型(python3已去除long類型,只剩下int類型的數據))屬於對象,不是變量。
5,不可變對象:一旦創建就不可修改的對象,包括字符串、元組、數字。
6,可變對象:可以修改的對象,包括列表、字典。
三 應用范圍
1,切片可以應用於:列表、元組、字符串,但不能應用於字典。
2,深淺拷貝,既可應用序列(列表、元組、字符串),也可應用字典。
四 作用
1,減少內存的使用。
2,以后在做數據的清洗、修改或者入庫的時候,對原數據進行復制一份,以防數據修改之后,找不到原數據。
五 應用
list類型
# 淺拷貝 ''' 淺拷貝方法: 1、a = b[:] 2、a = b.copy() 3、引用copy模塊,import cope | a = copy.copy(b) ''' wife = ['diaoqian',1988,['slaras',10000]] hasband = wife[:] print(wife,hasband) # ['diaoqian', 1988, ['slaras', 10000]] ['diaoqian', 1988, ['slaras', 10000]] hasband[0] = 'zhaoyun' hasband[2][1] = 2000 print(hasband) # ['zhaoyun', 1988, ['slaras', 2000]] print(wife) # ['diaoqian', 1988, ['slaras', 2000]] ''' 淺拷貝原則: 1、只復制一層,他變我不變,其余層,他變我也變。 2、如果只有一層,就相當於深復制了 ''' # 深拷貝 ''' 深拷貝方法: 1、引用copy模塊,import cope | a = copy.deepcopy(b) ''' import copy wife = ['diaoqian',1988,['slaras',10000]] hasband = copy.deepcopy(wife) print(wife,hasband) # ['diaoqian', 1988, ['slaras', 10000]] ['diaoqian', 1988, ['slaras', 10000]] hasband[0] = 'zhaoyun' hasband[2][1] = 8000 print(hasband) # ['zhaoyun', 1988, ['slaras', 8000]] print(wife) # ['diaoqian', 1988, ['slaras', 10000]] ''' 深拷貝小結: 1、深度拷貝就是克隆一份,具有自己單獨的內存地址,兩者完全不相干設,他變我不變。 '''
dict類型
# 淺拷貝 import copy wife = {'name':{'diaoq':30},'slaras':10000} hasband = copy.copy(wife) print(hasband,wife) # {'name': {'diaoq': 30}, 'slaras': 10000} {'name': {'diaoq': 30}, 'slaras': 10000} hasband['name']['diaoq']= 32 hasband['slaras'] = 12000 print(hasband) # {'slaras': 12000, 'name': {'diaoq': 32}} print(wife) # {'slaras': 10000, 'name': {'diaoq': 32}} # 深拷貝 import copy wife = {'slaras': 10000, 'name': {'diaoq': 30}} hasband = copy.deepcopy(wife) print(hasband,wife) # {'name': {'diaoq': 30}, 'slaras': 10000} {'name': {'diaoq': 30}, 'slaras': 10000} hasband['name']['diaoq'] = 32 hasband['slaras'] = 12000 print(hasband) # {'slaras': 12000, 'name': {'diaoq': 32}} print(wife) # {'slaras': 10000, 'name': {'diaoq': 30}}
總結:
-
不論針對列表還是字典,淺拷貝時,修改的元素類型是可變類型時,他變我也變,修改的類型是不可變類型時,他變我不變。
-
不論針對列表還是字典,深拷貝時,他變我不變。
-
可變類型:字典、列表。
-
不可變類型:整型、字符串、元組。