python中copy模块

Python中的赋值运算都是引用(即内存地址)的传递。对于可变类型来说,修改原数据的值,会改变赋值对象的值。
例子:
a = [11, 22]
b = [33, 44]
c = [a,b,‘hello’]
赋值是引用传递
d = c
c 和 d 指向的其实是同一个内存地址
print(c is d)

print© #[[11, 22], [33, 44], ‘hello’]
print(d) # [[11, 22], [33, 44], ‘hello’]

a.append(100)
c.append(‘hi’)

print© # [[11, 22, 100], [33, 44], ‘hello’, ‘hi’]
print(d) # [[11, 22, 100], [33, 44], ‘hello’, ‘hi’]

copy.copy()
浅拷贝:浅拷贝是对于一个对象的顶层拷贝;通俗的理解是:拷贝了引用,并没有拷贝内容。
切片其实是一种浅拷贝。
对于可变类型,会进行浅拷贝
对于不可变类型,不会拷贝,仅仅是指向

例子:
import copy

a = [11, 22]
b = [33, 44]
c = [a,b,‘hello’]

#copy 是浅拷贝,会把对象最上面的一层拷贝走
d = copy.copy©

#c 和 d 是两个不同的对象
print(c is d ) # False
#c[0] 和 d[0] 是同一个对象,浅拷贝只拷贝最上面的一层对象
print(c[0] is d[0]) # True
print(c[1] is d[1]) # True

print© # [[11, 22], [33, 44], ‘hello’]
print(d) # [[11, 22], [33, 44], ‘hello’]

#对象里的对象没有被拷贝走,所以修改对象内的对象时,会影响到d
a.append(100)
#最外层对象已经被拷贝走了,修改最外层对象里的数据,不会影响到d
c.append(‘hi’)

print© # [[11, 22, 100], [33, 44], ‘hello’, ‘hi’]
print(d) # [[11, 22, 100], [33, 44], ‘hello’]

copy.deepcopy()
深拷贝:深拷贝是对于一个对象所有层次的拷贝(递归)

例子:
import copy

a = [11, 22]
b = [33, 44]
c = [a,b,‘hello’]

#d 是对象c的深拷贝
d = copy.deepcopy©

#c 和 d是两个完全不同的对象
print(c is d) # False

#d里的每一个元素也都和c不同
print(c[0] is d[0])
print(c[1] is d[1])

print© #[[11, 22], [33, 44], ‘hello’]
print(d) #[[11, 22], [33, 44], ‘hello’]

a.append(100)
c.append(‘hi’)

print© #[[11, 22, 100], [33, 44], ‘hello’,‘hi’]
print(d) #[[11, 22], [33, 44], ‘hello’]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值