赋值、浅拷贝、深拷贝的区别

赋值、浅拷贝、深拷贝的区别

赋值 =

在 Python 中,对象的赋值就是简单的对象引用,赋值操作(包括对象作为参数、返回值)不会开辟新的内存空间,它只是复制了对象的引用。

a=[1,[2,3,'A'],4]
b=a

也就是说除了 b 这个名字之外,没有其他的内存开销。修改了 a,也就影响了 b,同理,修改了 b,也就影响了 a。

a=[1,[2,3,'A'],4]
b=a
a[0]=2
print(b)#结果:[2, [2, 3, 'A'], 4]

浅拷贝

浅拷贝的方式 : 切片操作 、工厂函数、 copy 模块中的 copy 函数
浅拷贝(shallow copy):浅拷贝会创建新对象,其内容非原对象本身的引用,而是原对象内第一层对象的引用。
如果在列表 a 中有一个嵌套的 list,如果我们修改了它,情况就不一样了。查看列表 b,会发现列表 b 也发生了变化,这是因为,我们修改了嵌 套的 list,修改外层元素,会修改它的引用,让它们指向别的位置,修改嵌套列表中的元素,列表的地 址并未发生变化,指向的都是用一个位置

import copy
# Create your tests here.
a=[1,[2,3,'A'],4]
b=copy.copy(a)
a[0]=2
print(b)#结果:[1, [2, 3, 'A'], 4]
a[1][2]='B'
print(b)#结果:[1, [2, 3, 'B'], 4]

深拷贝

深拷贝只有一种形式,copy 模块中的 deepcopy()函数。深拷贝和浅拷贝对应,深拷贝拷贝了对象的所有元素,包括多层嵌套的元素。因此,它的时间和空 间开销要高。同样的对列表 b,如果使用 b = copy.deepcopy(a),再修改列表 a 将不会影响到列表 b,即使嵌 套的列表具有更深的层次,也不会产生任何影响,因为深拷贝拷贝出来的对象根本就是一个全新的对象, 不再与原来的对象有任何的关联。

import copy
# Create your tests here.
a=[1,[2,3,'A'],4]
b=copy.deepcopy(a)
a[1][2]='B'
print(b)#结果:[1, [2, 3, 'A'], 4]
print(a)#结果:[1, [2, 3, 'B'], 4]

注意:

对于非容器类型,如数字、字符,以及其他的“原子”类型,没有拷贝一说,产生的都是原对象的引用。如果元组变量值包含原子类型对象,即使采用了深拷贝,也只能得到浅拷贝。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值