zl程序教程

您现在的位置是:首页 >  后端

当前栏目

大白话 python中的【=】 【copy】 和 【deepcopy】拷贝方式

Python 方式 拷贝 copy
2023-09-27 14:20:15 时间

写在前面的话

怎么说呢,这文章可看可不看,只要清楚自己的拷贝目的就行:

  1. 要是想独立拷贝,不受拷贝对象后续操作的影响就直接【deepcopy】,学术叫法是深拷贝,np.copy是深拷贝;
  2. 要是新的变量想跟着拷贝对象一起变化,那就直接【=】;
  3. 要是新的变量跟拷贝对象若即若离,藕断丝连,那就直接【copy】。(copy我不是很清楚这个函数的具体的使用场景,个人觉得功能很奇怪,学术的叫法是浅拷贝,我一般不会用这个函数)

演示代码

import copy

a= [1,2,3,4,['a','b']]
a1= [1,2,3,4] 
b=a
c=copy.copy(a)
c1=copy.copy(a1)
d=copy.deepcopy(a)
a.append(5)
a1.append(5)
a[4].append('c')

print("a:", a)
print("a1:", a1)
print("b:", b)
print("c:", c)
print("c1:", c1)
print("d:", d)

输出结果

总结:
对于无嵌套的列表a1,【copy】属于深拷贝,结果是变量c1
对于有嵌套的列表a,【=】【copy】都属于浅拷贝,【=】的结果是变量b,【copy】的结果是变量c(对最外的列表的是深拷贝,对内的列表是浅拷贝),【deepcopy】的结果是变量d

a: [1, 2, 3, 4, ['a', 'b', 'c'], 5]
a1: [1, 2, 3, 4, 5]
b: [1, 2, 3, 4, ['a', 'b', 'c'], 5]
c: [1, 2, 3, 4, ['a', 'b', 'c']]
c1: [1, 2, 3, 4]
d: [1, 2, 3, 4, ['a', 'b']]

对于有嵌套的列表a,【copy】的结果是变量c(对最外的列表的是深拷贝,对内的列表是浅拷贝),由打印的地址可以看出变量a和变量c的地址是不一样的,但是变量a[4]和变量c[4]的地址是一样的,那么对a内的小列表进行修改还是会改动变量c。

参考文章:[PYTHON] 深度解析copy.copy() 与 copy.deepcopy()

在这里插入图片描述