【python基础】python中copy用法

news/2025/1/10 14:41:10 标签: python, 开发语言

在Python中,**复制(copy)**变量的操作主要有两种:浅复制(shallow copy)深复制(deep copy)。这些复制方法会根据容器类型(如列表、字典等)不同的行为来决定如何复制对象。我们将分别介绍它们的用法和区别。

1. 浅复制(Shallow Copy)

浅复制是指创建一个新的对象,但新对象中的元素是对原始对象中元素的引用。对于可变类型(如列表、字典等),浅复制不会递归复制对象的内部元素,而是仅复制对象本身。

1.1 使用 copy() 方法

大部分容器类型(如列表、字典等)提供了一个内建的copy()方法来进行浅复制。

例子:

python"># 对列表进行浅复制
lst1 = [1, 2, 3, 4]
lst2 = lst1.copy()

print(lst1)  # 输出: [1, 2, 3, 4]
print(lst2)  # 输出: [1, 2, 3, 4]

# 修改原始列表
lst1[0] = 100
print(lst1)  # 输出: [100, 2, 3, 4]
print(lst2)  # 输出: [1, 2, 3, 4],浅复制,lst2不受影响
1.2 使用 copy 模块中的 copy() 函数

除了直接使用copy()方法,你还可以使用copy模块中的copy()函数来进行浅复制。

例子:

python">import copy

lst1 = [1, 2, 3, 4]
lst2 = copy.copy(lst1)

print(lst1)  # 输出: [1, 2, 3, 4]
print(lst2)  # 输出: [1, 2, 3, 4]
1.3 使用切片

对于列表,可以通过切片操作来创建一个新的列表,从而实现浅复制。

python">lst1 = [1, 2, 3, 4]
lst2 = lst1[:]

print(lst1)  # 输出: [1, 2, 3, 4]
print(lst2)  # 输出: [1, 2, 3, 4]
1.4 浅复制的限制

对于嵌套对象(即列表、字典等内部包含其他可变对象),浅复制只是复制了容器对象本身,而没有递归复制其中的元素。也就是说,嵌套对象的元素会是原始对象中的引用。

python">lst1 = [[1, 2], [3, 4]]
lst2 = lst1.copy()

lst1[0][0] = 100
print(lst1)  # 输出: [[100, 2], [3, 4]]
print(lst2)  # 输出: [[100, 2], [3, 4]],内层元素被共享

2. 深复制(Deep Copy)

深复制会递归地复制整个对象及其嵌套对象,创建一个完全独立的新对象。修改原对象及其内部元素不会影响到深复制的对象。

2.1 使用 copy 模块中的 deepcopy() 函数

深复制需要使用copy模块中的deepcopy()函数。这个函数会复制对象及其所有嵌套的对象,确保新对象与原始对象之间没有共享的引用。

例子:

python">import copy

lst1 = [[1, 2], [3, 4]]
lst2 = copy.deepcopy(lst1)

lst1[0][0] = 100
print(lst1)  # 输出: [[100, 2], [3, 4]]
print(lst2)  # 输出: [[1, 2], [3, 4]],深复制,内层元素独立
2.2 深复制的特点
  • 对于嵌套的可变对象,深复制会创建全新的对象,不会共享任何内存引用。
  • 深复制适用于需要完全独立副本的情况,修改其中一个副本不会影响其他副本。

3. 浅复制与深复制的区别

  • 浅复制:只复制对象本身,嵌套对象(如列表中的列表)会共享引用。适用于不修改嵌套元素的情况。
  • 深复制:递归地复制整个对象及其嵌套对象,创建完全独立的副本。适用于需要完全独立副本的情况。

4. 浅复制和深复制的性能差异

  • 浅复制比深复制性能更好,因为它不会递归地复制对象中的元素。它仅仅是复制对象本身,内部的元素依然是原始对象的引用。
  • 深复制会递归地复制整个对象,因此对于包含很多嵌套对象的数据结构,深复制的时间开销要大于浅复制。

5. 总结

  • 浅复制:创建一个新对象,但新对象中的元素依然指向原始对象中的元素。适用于不修改嵌套对象的情况。
  • 深复制:递归复制整个对象,创建一个完全独立的副本。适用于需要完全独立副本的情况。

希望这能帮你理解如何在Python中进行变量复制!如果你有更多问题,欢迎继续提问!


http://www.niftyadmin.cn/n/5818826.html

相关文章

基于单片机的智能婴儿监控系统设计(论文+源码)

1总体设计 本课题为基于单片机的智能婴儿监控系统设计,其整个系统架构如图2.1所示,其采用STC89C52单片机作为控制器,结合HC06蓝牙通信模块、尿床检测、哭闹检测模块、蜂鸣器、LCD液晶、DHT11温湿度传感器等构成整个系统,在功能上不…

洛谷 P3435 [POI2006] OKR-Periods of Words(扩展KMP+线段树做法)

题目链接 https://www.luogu.com.cn/problem/P3435 思路 我们先用扩展KMP算法对字符串 s s s进行预处理,求出 z z z数组。 对于字符串 s s s的第 i i i个字符,对于其 z z z数组的值 z [ i ] z[i] z[i],如果 z [ i ] ≥ 0 z[i] \ge 0 z[i]…

nginx反向代理和负载均衡的区别

1、反向代理,不需要服务器池,直接代理某台服务器 location / {proxy_pass http://192.168.18.201;proxy_set_header Host $host;proxy_set_header X-Forwarded-For $remote_addr; }proxy_set_header Host $host; …

C#,图论与图算法,任意一对节点之间最短距离的弗洛伊德·沃肖尔(Floyd Warshall)算法与源程序

一、弗洛伊德沃肖尔算法 Floyd-Warshall算法是图的最短路径算法。与Bellman-Ford算法或Dijkstra算法一样,它计算图中的最短路径。然而,Bellman Ford和Dijkstra都是单源最短路径算法。这意味着他们只计算来自单个源的最短路径。另一方面,Floy…

打包arm gstreamer镜像

在AMD上拉取ARM的gstreamer镜像,打包/加载 安装QEMU,它能在AMD上模拟arm环境,使得可以拉取arm镜像 sudo apt-get install qemu-user-static binfmt-support//注册 QEMU docker run --rm --privileged multiarch/qemu-user-static --reset -p…

GetMaterialApp组件的功能与用法

文章目录 1. 知识回顾2. 使用方法2.1 源码分析2.2 常用属性3. 示例代码4. 内容总结我们在上一章回中介绍了"Get包简介"相关的内容,本章回中将介绍GetMaterialApp组件.闲话休提,让我们一起Talk Flutter吧。 1. 知识回顾 我们在上一章回中已经介绍过GetMaterialApp组…

【C++动态规划 子集状压】1986. 完成任务的最少工作时间段|1995

本文涉及知识点 C动态规划 位运算、状态压缩、枚举子集汇总 LeetCode1986. 完成任务的最少工作时间段 你被安排了 n 个任务。任务需要花费的时间用长度为 n 的整数数组 tasks 表示,第 i 个任务需要花费 tasks[i] 小时完成。一个 工作时间段 中,你可以…

云计算安全需求分析与安全防护工程

23.1 概念与威胁分析 1)概念 在传统计算环境下,用户构建一个新的应用系统,需要做大量繁杂的工作,如采购硬件设备、安装软件包、编写软件,同时计算资源与业务发展难以灵活匹配,信息系统项目建设周期长。随…