Python基础学习13-浅拷贝和深拷贝

浅拷贝

对于某个对象,如何创建它的拷贝呢?也就是说,如何创建与该对象具有相同值的另一个对象呢?

所谓浅拷贝是指,对于某个对象,虽然创建了与该对象具有相同值的另一个对象,但是,这两个对象内部嵌套的对应的子对象全都是同一个对象。简单的说,外部进行了拷贝,内部没有拷贝。

以下方式得到的拷贝都是浅拷贝:

  1. 切片操作 [:]
  2. 调用列表、字典、结合的方法 copy()
  3. 调用内置函数 list() 、dict()、set()
  4. 调用标准库模块 copy 中的函数 copy()
L1 = [[3, 6], 8]
L2 = L1[:]
L2 = L1.copy()
L2 = list(L1)
import copy
L2 = copy.copy(L1)  # 调用标准库模块 copy 中的函数 copy
print(L2)       # [[3, 6], 8]

print('id(L1):%s' % id(L1))     # id(L1):2484307186696
print('id(L2):%s' % id(L2))     # id(L2):2484596315592

print('id(L1[0]):%s' % id(L1[0]))       # id(L1[0]):2326147256840
print('id(L2[0]):%s' % id(L2[0]))       # id(L1[0]):2326147256840

print('id(L1[1]):%s' % id(L1[1]))       # id(L1[1]):140733955146224
print('id(L2[1]):%s' % id(L2[1]))       # id(L2[1]):140733955146224


L1[0][1] = 7
L1[1] = 9
print(L1)       # [[3, 7], 9]
print(L2)       # [[3, 7], 8]


# 对于没有嵌套子对象的不可变对象,例如:整数对象,字符串对象和元组对象等,不会进行拷贝,也就是说,不会创建另一个对象
i = 18
ic1 = int(18)
print(ic1)      # 18

print('id(i):%s' % id(i))           # id(i):140733955146544
print('id(ic1):%s' % id(ic1))       # id(ic1):140733955146544

ic2 = copy.copy(i)
print(ic2)      # 18

print('id(i):%s' % id(i))           # id(i):140733947020080
print('id(ic1):%s' % id(ic1))       # id(ic1):140733947020080


t = (1, 2, 3)

tc1 = tuple(t)
print(tc1)      # (1, 2, 3)

print('id(t):%s' % id(t))           # id(t):1951394906264
print('id(tc1):%s' % id(tc1))       # id(t):1951394906264

tc2 = copy.copy(t)
print(tc2)      # (1, 2, 3)

print('id(t):%s' % id(t))           # id(t):1980822143128
print('id(tc2):%s' % id(tc2))       # id(tc2):1980822143128

 

深拷贝

所谓深拷贝,指的是:对于某个对象,创建与该对象具有相同值的另一个对象,同时,这两个对象内部嵌套的对应可变子对象,全都不是同一个对象。简单的说,外部和内部都进行了拷贝。

如果不可变对象,内部有嵌套的可变的子对象,在深拷贝后会创建一个与该不可变对象具有相同值的另一个对象

import copy

# 对于没有嵌套子对象的不可变对象,例如:整数对象,字符串对象和元组对象等,不会进行拷贝,也就是说,不会创建另一个对象
i = 18

ic = copy.deepcopy(i)
print(ic)      # 18

print('id(i):%s' % id(i))           # id(i):140734429037360
print('id(ic):%s' % id(ic))       # id(ic):140734429037360


t = (1, 2, 3)

tc = copy.deepcopy(t)
print(tc)      # (1, 2, 3)

print('id(t):%s' % id(t))           # id(t):1492343996568
print('id(tc):%s' % id(tc))       # id(tc):1492343996568


L1 = [[3, 6], 8]

L2 = copy.deepcopy(L1)
print(L2)           # [[3, 6], 8]
print('id(L1):%s' % id(L1))     # id(L1):1744899232776
print('id(L2):%s' % id(L2))     # id(L2):1745186688264

print('id(L1[0]):%s' % id(L1[0]))       # id(L1[0]):1744899232264
print('id(L2[0]):%s' % id(L2[0]))       # id(L2[0]):1744900612488

print('id(L1[1]):%s' % id(L1[1]))       # id(L1[1]):140734429037040
print('id(L2[1]):%s' % id(L2[1]))       # id(L2[1]):140734429037040

L1[0][1] = 7
L1[1] = 9
print(L1)       # [[3, 7], 9]
print(L2)       # [[3, 6], 8]


t1 = ([3, 6], 8)

t2 = copy.deepcopy(t1)
print(t2)           # ([3, 6], 8)
print('id(t1):%s' % id(t1))     # id(t1):3119702275208
print('id(t2):%s' % id(t2))     # id(t2):3119702236424

print('id(t1[0]):%s' % id(t1[0]))       # id(t1[0]):3119702526728
print('id(t2[0]):%s' % id(t2[0]))       # id(t2[0]):3119702415176

print('id(t1[1]):%s' % id(t1[1]))       # id(t1[1]):140734429037040
print('id(t2[1]):%s' % id(t2[1]))       # id(t2[1]):140734429037040

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值