python 中的拷贝、浅拷贝与深拷贝

0.序列指什么?

序列类型是指容器内的元素从0开始的索引顺序访问,一次可以访问一个或者多个元素,包括字符串(string)、元组(tuple)、列表(list):
The difference between tuple and list:
Tuple would not be changed, but list would.
>>> a = (1,2,3)
>>> b = [1,2,3]
>>> b.append(4)
>>> a.append(4)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'append'
1.什么是拷贝?
Copy操作意味着两个在内存中不同的对象,所以对应的id也是不一样的。
>>> ls1 = [1,2,3]
>>> ls2 = ls1[:]
>>> id(ls1),id(ls2)
(140439195044104, 140439195058760)
>>> tp1 = (1,2,3)
>>> tp2 = ls1[:]
>>> id(tp1),id(tp2)
(140439194958816, 140439194958816)
为什么tuple的id没有变化而list的tuple发生了变化了呢?这个是由于Python解释器的实现导致的,由于tuple是immutable的,所以说没有必要在内存里维护多个一样字面意义的tuple,因此Python对于Tuple的Copy操作,实际上是增加了一个Reference Count而已,并没有做真正的Copy,所以ID的返回值是一样的。

这是浅拷贝还是深拷贝?
一般以下所得到的都是浅拷贝:


2.什么是浅拷贝?
浅拷贝是指当序列中包含容器时,拷贝后新序列的容器只是原序列容器的引用

>>> a = (1,3,5,[2,4])
>>> b = a[:]
>>> b[3].append(6)
>>> a,b
((1, 3, 5, [2, 4, 6]), (1, 3, 5, [2, 4, 6]))

3.什么是深拷贝?
深拷贝是指拷贝后序列中的容器也拷贝过去,而不存在引用关系。

>>> c = copy.deepcopy(a)
>>> c[3].append(8)
>>> a,c
((1, 3, 5, [2, 4, 6]), (1, 3, 5, [2, 4, 6, 8]))

4.总结:
考察是不是浅拷贝的方法是两者的容器是否指向同一个地址。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值