Python3 深淺拷貝


一 定義

在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}}

總結:

  1. 不論針對列表還是字典,淺拷貝時,修改的元素類型是可變類型時,他變我也變,修改的類型是不可變類型時,他變我不變。

  2. 不論針對列表還是字典,深拷貝時,他變我不變。

  3. 可變類型:字典、列表。

  4. 不可變類型:整型、字符串、元組。


免責聲明!

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



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