首頁(yè)常見(jiàn)問(wèn)題正文

python中copy和deepcopy區(qū)別?

更新時(shí)間:2023-12-28 來(lái)源:黑馬程序員 瀏覽量:

IT培訓(xùn)班

  在Python中,copy和deepcopy都是用于復(fù)制對(duì)象的方法,但它們之間有著重要的區(qū)別。

  1.copy方法:

  copy方法創(chuàng)建了一個(gè)新的對(duì)象,并將原始對(duì)象的元素(對(duì)于可變對(duì)象,是其引用)復(fù)制到新對(duì)象中。這意味著對(duì)于不可變對(duì)象,copy產(chǎn)生的是原始對(duì)象的副本,而對(duì)于可變對(duì)象,則復(fù)制了對(duì)象的引用。對(duì)于可變對(duì)象,如果對(duì)原始對(duì)象進(jìn)行了更改,新對(duì)象也會(huì)受到影響。

import copy

# 不可變對(duì)象(int)
original_int = 5
copied_int = copy.copy(original_int)

print(original_int)  # 輸出: 5
print(copied_int)    # 輸出: 5

# 改變?cè)紝?duì)象的值
original_int = 10

print(original_int)  # 輸出: 10
print(copied_int)    # 輸出: 5(副本不受影響)
# 可變對(duì)象(list)
original_list = [1, 2, 3]
copied_list = copy.copy(original_list)

print(original_list)  # 輸出: [1, 2, 3]
print(copied_list)    # 輸出: [1, 2, 3]

# 改變?cè)紝?duì)象
original_list.append(4)

print(original_list)  # 輸出: [1, 2, 3, 4]
print(copied_list)    # 輸出: [1, 2, 3, 4](因?yàn)閺?fù)制的是引用,副本也受到影響)

  2.deepcopy方法:

  deepcopy方法也創(chuàng)建了一個(gè)新的對(duì)象,但它會(huì)遞歸復(fù)制原始對(duì)象及其內(nèi)部所有可變對(duì)象的內(nèi)容,而不僅僅是引用。這樣,即使原始對(duì)象的內(nèi)容發(fā)生變化,深拷貝后的對(duì)象也不會(huì)受到影響。

import copy

# 可變對(duì)象(list)的嵌套
original_nested_list = [1, [2, 3], 4]
deep_copied_list = copy.deepcopy(original_nested_list)

print(original_nested_list)  # 輸出: [1, [2, 3], 4]
print(deep_copied_list)      # 輸出: [1, [2, 3], 4]

# 修改原始對(duì)象內(nèi)部的嵌套列表
original_nested_list[1][0] = 5

print(original_nested_list)  # 輸出: [1, [5, 3], 4](原始對(duì)象改變)
print(deep_copied_list)      # 輸出: [1, [2, 3], 4](深拷貝對(duì)象不受影響)

  總結(jié)來(lái)說(shuō),copy只復(fù)制了對(duì)象的引用,因此對(duì)于可變對(duì)象來(lái)說(shuō),如果原始對(duì)象發(fā)生變化,副本也會(huì)相應(yīng)變化。而deepcopy則會(huì)遞歸復(fù)制整個(gè)對(duì)象結(jié)構(gòu),即使對(duì)象內(nèi)部嵌套了其他可變對(duì)象,也能完全獨(dú)立復(fù)制,從而確保深拷貝后的對(duì)象不受原始對(duì)象變化的影響。

分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!