python学习 - copy模块的浅复制(copy)与深复制(deepcopy)

article/2025/1/18 18:13:39

python学习 - copy模块的浅复制(copy)与深复制(deepcopy)

    • 简介
    • copy.copy()详解
    • copy.deepcopy()详解

简介

在使用列表或者字典进行传递参数的时候,可能会遇到函数改变了列表的值,但是不希望印象原来列表中的值,所以,python提供了copy模块,其中包含copy()和deepcopy()两函数,顾名思义copy()指的就是浅复制,deepcopy()指的就是深复制。

copy.copy()详解

copy.copy()主要是用来复制一维列表或者一维元组,即 像[‘A’,‘B’,‘C’,‘D’]这种,如果列表中再套列表,比如这种[‘A’,‘B’,[‘d’,‘e’,‘f’],‘C’] 就不能进行复制更改。下面来做一个简单的测试。

import copy
lis_A = ['A','B','C','D']
lis_B = ['A','B',['d','e','f'],'C']# 使用copy.copy()复制lis_A
copy_A = copy.copy(lis_A)
print('lis_A的值',  lis_A)
print('copy_A的值', copy_A)# 打印出lis_A和copy_A的ID值
print('lis_A的ID值',  id(lis_A))
print('copy_A的ID值', id(copy_A))

输出结果是:

lis_A的值 ['A', 'B', 'C', 'D']
copy_A的值 ['A', 'B', 'C', 'D']
lis_A的ID值 1347357010368
copy_A的ID值 1347357613888

这里可以看出。copy_A的值与lis_A的值是一样的,但是它们的ID值是不一样的,说明copy_A指向了一个独立的列表。那么改变copy_A的值是不会去影响lis_A的列表的值,可以做试验:

从上面可以看出,我改变了copy_A中的 ‘B’ 的值,但是并没有影响到lis_A中的值。

使用copy()复制嵌套列表会是什么结果呢?

lis_B = ['A', 'B', ['d', 'e', 'f'], 'C']
# 使用copy_B复制 lis_B
copy_B = copy.copy(lis_B)# 分别打印lis_B和copy_B的值
print('lis_B的值',  lis_B)
print('copy_B的值', copy_B)# 打印出lis_B和copy_B的ID值
print('lis_B的ID值',  id(lis_B))
print('copy_B的ID值', id(copy_B))

输出的结果是:

lis_B的值 ['A', 'B', ['d', 'e', 'f'], 'C']
copy_B的值 ['A', 'B', ['d', 'e', 'f'], 'C']
lis_B的ID值 2116281195712
copy_B的ID值 2116321275968

咦,也复制出来了呀,怎么回事?别急,接着看,我们 改变一下copy_B中的 B 的值试试。

lis_B = ['A', 'B', ['d', 'e', 'f'], 'C']
# 使用copy_B复制 lis_B
copy_B = copy.copy(lis_B)
# 改变copy_B中的 B 的值
copy_B[1] = '改变B'# 分别打印lis_B和copy_B的值
print('lis_B的值',  lis_B)
print('copy_B的值', copy_B)# 打印出lis_B和copy_B的ID值
print('lis_B的ID值',  id(lis_B))
print('copy_B的ID值', id(copy_B))

输出结果:

lis_B的值 ['A', 'B', ['d', 'e', 'f'], 'C']
copy_B的值 ['A', '改变B', ['d', 'e', 'f'], 'C']
lis_B的ID值 2258614705408
copy_B的ID值 2258654720640

从上可以看出,copy_B中B的值已经被改变了,怎么回事?要翻车了吗?
我们再改变一下copy_B中的的整个列表试试?

lis_B = ['A', 'B', ['d', 'e', 'f'], 'C']
# 使用copy_B复制 lis_B
copy_B = copy.copy(lis_B)# # 改变copy_B中的 B 的值
# copy_B[1] = '改变B'# 改变lis_B中嵌套的列表 试试?
copy_B[2] = ['1', '2', '3']# 分别打印lis_B和copy_B的值
print('lis_B的值', lis_B)
print('copy_B的值', copy_B)# 打印出lis_B和copy_B的ID值
print('lis_B的ID值', id(lis_B))
print('copy_B的ID值', id(copy_B))

输出的结果是:

lis_B的值 ['A', 'B', ['d', 'e', 'f'], 'C']
copy_B的值 ['A', 'B', ['1', '2', '3'], 'C']
lis_B的ID值 1860576959872
copy_B的ID值 1860618301312

copy_B的列表也变了。在改变一下copy_B嵌套列表 [‘1’, ‘2’, ‘3’] 中的‘2’的值呢?

lis_B = ['A', 'B', ['d', 'e', 'f'], 'C']
# 使用copy_B复制 lis_B
copy_B = copy.copy(lis_B)# # 改变copy_B中的 B 的值
# copy_B[1] = '改变B'# 改变lis_B中嵌套的列表 试试?
copy_B[2] = ['1', '2', '3']
# 改变lis_B中嵌套的列表中的值 试试?
copy_B[2][1] = '改变2'# 分别打印lis_B和copy_B的值
print('lis_B的值', lis_B)
print('copy_B的值', copy_B)# 打印出lis_B和copy_B的ID值
print('lis_B的ID值', id(lis_B))
print('copy_B的ID值', id(copy_B))

输出结果:

lis_B的值 ['A', 'B', ['d', 'e', 'f'], 'C']
copy_B的值 ['A', 'B', ['1', '改变2', '3'], 'C']
lis_B的ID值 2763457256768
copy_B的ID值 2763497140352

啊,‘2’也改变了,没有影响lis_B的值,怎么回事啊,翻车了吗?
我们直接改变复制出来的copy_B的嵌套列表的值,不先改变嵌套列表试试呢。

lis_B = ['A', 'B', ['d', 'e', 'f'], 'C']
# 使用copy_B复制 lis_B
copy_B = copy.copy(lis_B)# # 改变copy_B中的 B 的值
# copy_B[1] = '改变B'# # 改变lis_B中嵌套的列表 试试?
# copy_B[2] = ['1', '2', '3']
# # 改变lis_B中嵌套的列表中的值 试试?
# copy_B[2][1] = '改变2'
# 直接改变copy_B的值,将上两步注释掉,此时copy_B = lis_B = ['A', 'B', ['d', 'e', 'f'], 'C']
copy_B[2][1] = '改变2'  # 改变2 是改变 ['A', 'B', ['d', 'e', 'f'], 'C'] 中的 e# 分别打印lis_B和copy_B的值
print('lis_B的值', lis_B)
print('copy_B的值', copy_B)# 打印出lis_B和copy_B的ID值
print('lis_B的ID值', id(lis_B))
print('copy_B的ID值', id(copy_B))

输出结果:

lis_B的值 ['A', 'B', ['d', '改变2', 'f'], 'C']
copy_B的值 ['A', 'B', ['d', '改变2', 'f'], 'C']
lis_B的ID值 2342836779328
copy_B的ID值 2342878850496

神奇的一幕发生了,改变的是copy_B中的e的值,但是lis_B中e的值也发生了改变。

看懂了吗?这就是使用copy.copy()复制嵌套列表的弊端,表面看复制了lis_B[但是有没有完全复制 lis_B ,这种情况就要使用deepcopy()来进行复制。

但是,为什么之前的情况.为什么能将嵌套列表[‘d’, ‘e’, ‘f’]改为[‘1’, ‘2’, ‘3’],再将[‘1’, ‘2’, ‘3’]的 ‘2’ 变为 ‘改变2’呢。
(1)为什么能将 [‘A’, ‘B’, [‘d’, ‘e’, ‘f’], ‘C’] 变为 [‘A’, ‘B’, [‘1’, ‘2’, ‘3’], ‘C’]?
简单理解,在整体改变[‘d’, ‘e’, ‘f’] 可以把他看做为一个整体,由X来代替,[‘1’, ‘2’, ‘3’]由Y来代替。所以此时的变更相当于把[‘A’, ‘B’, X, ‘C’] 变更为 [‘A’, ‘B’, Y, ‘C’]。实际上变更的还是一维列表。copy.copy()是可以复制一维列表的。
(2)为什么 copy_B = [‘A’, ‘B’, [‘d’, ‘e’, ‘f’], ‘C’] 变为 [‘A’, ‘B’, [‘1’, ‘2’, ‘3’], ‘C’],再去变[‘1’, ‘2’, ‘3’]中的‘2’时,不会影响lis_B = [‘A’, ‘B’, [‘d’, ‘e’, ‘f’], ‘C’]?
原因是第一步将 copy_B = [‘A’, ‘B’, [‘d’, ‘e’, ‘f’], ‘C’] 变为 [‘A’, ‘B’, [‘1’, ‘2’, ‘3’], ‘C’] 此时已经产生了一个新的列表 [‘A’, ‘B’, [‘1’, ‘2’, ‘3’], ‘C’] ,与列表 lis_B = [‘A’, ‘B’, [‘d’, ‘e’, ‘f’], ‘C’] 是两个完全不相同的两个列表。自然不回影响。

如果说有个列表 lis_C = [‘A’, ‘B’, [‘d’, ‘e’, ‘f’], [‘x’,‘y’]],先变为 [‘A’, ‘B’, [‘1’, ‘2’, ‘3’], [‘x’,‘y’]],再去改变 'x’变会对源列表产生影响

# 定义一个lis_C
lis_C = ['A', 'B', ['d', 'e', 'f'], ['x', 'y']]# 复制一个 copy_C
copy_C = copy.copy(lis_C)
# copy_C = ['A', 'B', ['d', 'e', 'f'], ['x', 'y']] 变为 ['A', 'B', ['1', '2', '3'], ['x', 'y']]
copy_C[2] = ['1', '2', '3']# 在来改变 ['A', 'B', ['1', '2', '3'], ['x', 'y']] 中 'x'的值
copy_C[3][0] = '改变x'# 分别打印copy_C和copy_C的值
print('lis_C的值', lis_C)
print('copy_C的值', copy_C)# 打印出lis_C和copy_C的ID值
print('lis_C的ID值', id(lis_C))
print('copy_C的ID值', id(copy_C))

输出结果:

lis_C的值 ['A', 'B', ['d', 'e', 'f'], ['改变x', 'y']]
copy_C的值 ['A', 'B', ['1', '2', '3'], ['改变x', 'y']]
lis_C的ID值 2790729135616
copy_C的ID值 2790729135424

从可以看出,copy_C 中[‘d’, ‘e’, ‘f’] 变成[ ‘1’, ‘2’, ‘3’]时,并不影响lis_C,在 将 [‘x’, ‘y’] 变为 [‘改变x’, ‘y’]时就会印象lis_C

copy.deepcopy()详解

上面说到,在使用copy.copy()复制嵌套的二维列表[‘A’, ‘B’, [‘d’, ‘e’, ‘f’], [‘x’, ‘y’]],然后改变嵌套列表中的值是,会影响到源列表的值,那么使用copy.deepcopy()是否会影响源列表呢?

import copy
# 定义一个lis_D
lis_D = ['A', 'B', ['d', 'e', 'f'], ['x', 'y']]# 使用deepcopy()复制一个 copy_C
copy_D = copy.deepcopy(lis_D)
# 直接改变 copy_D 中嵌套列表 ['d', 'e', 'f'] 中的值d
copy_D[2][0] = '改变d'# 分别打印copy_D和copy_D的值
print('lis_D的值', lis_D)
print('copy_D的值', copy_D)# 打印出lis_D和copy_D的ID值
print('lis_D的ID值', id(lis_D))
print('copy_D的ID值', id(copy_D))

输出结果:

lis_D的值 ['A', 'B', ['d', 'e', 'f'], ['x', 'y']]
copy_D的值 ['A', 'B', ['改变d', 'e', 'f'], ['x', 'y']]
lis_D的ID值 2335362856512
copy_D的ID值 2335362856320

从上述结果可以很明显的看出,使用deepcopy()复制列表lis_之后,直接改变二维列表中的值 d,不会影响到源列表lis_D


http://chatgpt.dhexx.cn/article/2lhgXHq5.shtml

相关文章

python中copy()和deepcopy()详解

参考文章 http://iaman.actor/blog/2016/04/17/copy-in-python **首先直接上结论: —–我们寻常意义的复制就是深复制,即将被复制对象完全再复制一遍作为独立的新个体单独存在。所以改变原有被复制对象不会对已经复制出来的新对象产生影响。 —–而浅…

不懂copy与deepcopy的区别?这一篇就够了

背景 在运用Python进行开发代码过程中,会遇到变量复制备份的场景,但并没有得到预期的结果,例如下面的例子: lista [a, b, [1, 2, 3]] listb lista.copy() lista[2].append(4)print(lista) # [a, b, [1, 2, 3, 4]] print(list…

浅拷贝(shallow copy)和深拷贝(deep copy)

浅拷贝(shallow copy):只负责克隆按值传递的数据(比如基本数据类型、String类型) 深拷贝(deep copy):除了shallow copy的值外,还负责克隆引用类型的数据,基本…

js深拷贝deepCopy教程:支持循环引用、类型不丢失、可扩展、可定制

目录 1. 背景2. 简介3. 安装方式 3.1. 方式1&#xff1a;通过 npm 安装3.2. 方式2&#xff1a;直接下载原代码3.3. 方式3&#xff1a;通过<script>标签引入 4. 教程 4.1. API简介4.2. 基本使用4.3. 拷贝函数4.4. 指定拷贝深度4.5. 循环引用4.6. 保持类型信息4.7. 拷贝不可…

深入理解Python深拷贝(deepcopy)、浅拷贝(copy)、等号拷贝----看了还不懂找我

编程中难免会遇到copy&#xff08;浅拷贝&#xff09;与deepcopy&#xff08;深拷贝&#xff09;问题&#xff0c;一不小心就会掉进坑中了&#xff0c;或许很多人只知道有深浅拷贝&#xff0c;但是你又知道copy和""拷贝有什么区别么&#xff1f;也许很少有人对二者的…

Python-copy()与deepcopy()区别

最近在实习&#xff0c;boss给布置了一个python的小任务&#xff0c;学习过程中发现copy&#xff08;&#xff09;和deepcopy&#xff08;&#xff09;这对好基友实在是有点过分&#xff0c;搞的博主就有点傻傻分不清啊&#xff0c;但是呢本着一探到底的精神&#xff0c;还是要…

三分钟入门大数据之什么是用户画像?

哈喽&#xff0c;大家好&#xff0c;我是汉斯老师。近几年来&#xff0c;互联网行业由于较高的薪资收入&#xff0c;受到许多人的追捧。很多年轻的学子&#xff0c;或是其他行业的有志青年&#xff0c;都想要投身到这个行业中来。然而一方面受到“互联网寒冬”的影响&#xff0…

什么是用户画像?金融行业大数据用户画像实践

金融消费者逐渐年轻化&#xff0c;80、90后成为客户主力&#xff0c;他们的消费意识和金融意识正在增强。金融服务正在从以产品为中心&#xff0c;转向以消费者为中心。所有金融行业面对的最大挑战是消费者的消费行为和消费需求的转变&#xff0c;金融企业迫切需要为产品寻找目…

银行用户画像简介

当我们讨论产品、需求、场景、用户体验时&#xff0c;往往需要将焦点聚集在某类人群上&#xff0c;用户画像便是一种抽象的方法&#xff0c;是目标用户的集合。本文作者对银行用户画像体系的建设进行了分析&#xff0c;希望能给你带来一些帮助。 用户画像的正式英文名称是User …

用户画像基础之用户画像是什么

目录 0. 相关文章链接 1. 用户画像是什么 2. 画像简介 3. 标签类型 注&#xff1a;此博文为根据 赵宏田 老师的 用户画像方法论与工程化解决方案 一书读后笔记而来&#xff0c;仅供学习使用 0. 相关文章链接 用户画像文章汇总 1. 用户画像是什么 在互联网步入大数据时代…

详解用户画像

01画像简介 用户画像&#xff0c;即用户信息标签化&#xff0c;通过收集用户的社会属性、消费习惯、偏好特征等各个维度的数据&#xff0c;进而对用户或者产品特征属性进行刻画&#xff0c;并对这些特征进行分析、统计&#xff0c;挖掘潜在价值信息&#xff0c;从而抽象出用户的…

用户画像——什么是用户画像?和用户画像的计算框架选型

用户画像——什么是用户画像&#xff1f;和用户画像的计算框架选型 1.什么是用户画像&#xff1f; 1.1 应用场景 1.1.1 精细化运营 1.1.2 推荐系统 1.2 概念定义 1.2.1 总结场景对数据的需求 1.2.2 实现这些场的数据结构 1.2.3 用户画像的概念 2.用户画像…

什么是用户画像,流程、方法是什么?

什么是用户画像&#xff0c;流程、方法是什么? 01 用户画像概述1. 什么是用户画像2. 为什么需要用户画像 02 用户画像流程1. 整体流程1&#xff09;目标分析2&#xff09;标签体系构建3&#xff09;画像构建 2. 标签体系1&#xff09;事实标签2&#xff09;模型标签3&#xff…

一文让你彻底明白,到底什么是用户画像?

写在前面&#xff1a; 博主是一名大数据的初学者&#xff0c;昵称来源于《爱丽丝梦游仙境》中的Alice和自己的昵称。作为一名互联网小白&#xff0c;写博客一方面是为了记录自己的学习历程&#xff0c;一方面是希望能够帮助到很多和自己一样处于起步阶段的萌新。由于水平有限&a…

什么是用户画像——从零开始搭建实时用户画像(一)

用户画像 简介 用户画像&#xff0c;作为一种勾画目标用户、联系用户诉求与设计方向的有效工具&#xff0c;用户画像在各领域得到了广泛的应用。 用户画像最初是在电商领域得到应用的&#xff0c;在大数据时代背景下&#xff0c;用户信息充斥在网络中&#xff0c;将用户的每…

帮你更好地了解什么是用户画像

用户画像是一个挺新颖的词,最初它是大数据行业言必及之的时髦概念。现在我们运营谈及用户画像,它也是和精准营销、精细化运营直接钩挂的。 什么是用户画像? 在中文的语言环境中,用户画像是用来描述用户特征(用户背景、特征、性格标签、行为场景等)和联系用户需求与产品…

什么是用户画像,用户画像的作用是什么?

更多行业干货,上网易游戏学院app查看! https://game.academy.163.com/ssi/app/?referrer=niuke 什么是用户画像? 用户画像,由交互大师艾伦库伯在他的著作《交互设计精髓4》(《AboutFace 4》)中提出。他在书中介绍:“用户画像来源于研究中真实用户的行为和动机。用户画…

什么是用户画像?如何构建用户画像?

我们通过这篇文章&#xff0c;介绍我们理解的两种用户画像&#xff08;User Persona 和 User Profile&#xff09;&#xff0c;以及如何构建用户画像&#xff08;User Profile&#xff09;的标签体系并驱动产品智能。 User Persona 第一种用户画像&#xff08;User Persona&a…

用户画像(一)

本文转自&#xff1a;用户画像实践篇 终于有人把用户画像的流程、方法讲明白了 1 什么是用户画像 1. 1 概述 通过分析用户的基础信息、特征偏好、社会属性等各维度的数据&#xff0c;刻画出用户的信息全貌&#xff0c; 从中挖掘用户价值&#xff0c;从而提供个性化推荐、精准…

什么是真正的用户画像

如今在这个大数据时代&#xff0c;每个用户都被标签化&#xff0c;运用用户画像的方式了解用户&#xff0c;从而推送相关消息&#xff1b;最常见的情况就是你买了商品后&#xff0c;推荐会自动推送与此商品相关的商品&#xff0c;促进消费&#xff1b;本文作者分享了关于什么是…