Python中深拷贝和浅拷贝的区别

本文将从以下几个方面对Python中深拷贝和浅拷贝的区别做详细的阐述,包括:拷贝的含义、变量和对象的区别、浅拷贝的示例、深拷贝的示例、可变对象和不可变对象的区别、嵌套的数据结构以及深浅拷贝应用案例等。

一、拷贝的含义

拷贝是指将一个对象的值复制到另一个对象中,使得这个新对象有一个独立的存在方式。在Python中,拷贝操作是使用“=”符号或者copy()函数实现的。

二、变量和对象的区别

变量是指标识符,存储的是对象的引用,而对象是指具有数据类型的实体。

在Python中,对象可以分为可变对象和不可变对象,可变对象是指可以修改的对象,比如list和dict等,而不可变对象是指不能修改的对象,比如int、float、tuple等。

三、浅拷贝的示例

import copy

a = [1, 2, [3, 4]]
b = copy.copy(a)

print(a)  # [1, 2, [3, 4]]
print(b)  # [1, 2, [3, 4]]

a[2].append(5)
print(a)  # [1, 2, [3, 4, 5]]
print(b)  # [1, 2, [3, 4, 5]]

上述代码中,a是一个列表,其中还嵌套了一个列表[3, 4]。使用copy.copy()方法将a进行浅拷贝,得到了b。如果修改a的嵌套列表,可以发现b也会被修改,这是因为浅拷贝只拷贝了最外层的值,而对于嵌套的列表和字典等可变对象,只是拷贝了引用,没有创建新的对象。

四、深拷贝的示例

import copy

a = [1, 2, [3, 4]]
b = copy.deepcopy(a)

print(a)  # [1, 2, [3, 4]]
print(b)  # [1, 2, [3, 4]]

a[2].append(5)
print(a)  # [1, 2, [3, 4, 5]]
print(b)  # [1, 2, [3, 4]]

上述代码使用copy.deepcopy()方法进行深拷贝,不仅仅拷贝了最外层的值,而且对于嵌套的列表和字典等可变对象,也创建了新的对象。因此,修改a的嵌套列表不会影响b。

五、可变对象和不可变对象的区别

在Python中,可变对象是指可以修改的对象,比如list和dict等,而不可变对象是指不能修改的对象,比如int、float、tuple等。拷贝可变对象时,浅拷贝只是拷贝了对象的引用,而深拷贝会创建新的对象。拷贝不可变对象时,无论是浅拷贝还是深拷贝,都会生成新的对象。

六、嵌套的数据结构

import copy

a = [1, 2, [3, 4, [5, 6]]]
b = copy.deepcopy(a)

print(a)  # [1, 2, [3, 4, [5, 6]]]
print(b)  # [1, 2, [3, 4, [5, 6]]]

a[2][2].append(7)
print(a)  # [1, 2, [3, 4, [5, 6, 7]]]
print(b)  # [1, 2, [3, 4, [5, 6]]]

上述代码中,a是一个嵌套的列表,其中还包含嵌套列表。使用copy.deepcopy()方法进行深拷贝时,会递归地创建新的对象。因此,修改a的嵌套列表中的数据,不会影响到b。

七、深浅拷贝应用案例

深浅拷贝在Python的开发中非常常见。其中,浅拷贝可以用于共享数据,创建副本等;深拷贝则常用于数据备份、数据传输、数据恢复等。

下面是一个深浅拷贝应用案例:

import copy

original = {
    'name': 'Tom',
    'age': 18,
    'education': {
        'degree': 'bachelor',
        'major': 'Engineering'
    },
    'interests': ['music', 'sports']
}

# 浅拷贝
new_dict1 = copy.copy(original)
original['education']['major'] = 'Computer Science'
print(new_dict1)  # {'name': 'Tom', 'age': 18, 'education': {'degree': 'bachelor', 'major': 'Computer Science'}, 'interests': ['music', 'sports']}

# 深拷贝
new_dict2 = copy.deepcopy(original)
original['education']['major'] = 'Math'
print(new_dict2)  # {'name': 'Tom', 'age': 18, 'education': {'degree': 'bachelor', 'major': 'Computer Science'}, 'interests': ['music', 'sports']}

上述代码中,original是一个包含嵌套字典和列表的数据结构。使用浅拷贝将original拷贝到new_dict1中,修改original中嵌套字典的值,可以看到new_dict1也被修改了,这是由于修改了引用地址的缘故。而使用深拷贝将original拷贝到new_dict2中,修改original中嵌套字典的值,并不会影响new_dict2。

原创文章,作者:CQQZH,如若转载,请注明出处:https://www.506064.com/n/374637.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
CQQZH的头像CQQZH
上一篇 2025-04-28 13:17
下一篇 2025-04-28 13:17

相关推荐

  • Python中引入上一级目录中函数

    Python中经常需要调用其他文件夹中的模块或函数,其中一个常见的操作是引入上一级目录中的函数。在此,我们将从多个角度详细解释如何在Python中引入上一级目录的函数。 一、加入环…

    编程 2025-04-29
  • Python列表中负数的个数

    Python列表是一个有序的集合,可以存储多个不同类型的元素。而负数是指小于0的整数。在Python列表中,我们想要找到负数的个数,可以通过以下几个方面进行实现。 一、使用循环遍历…

    编程 2025-04-29
  • Python周杰伦代码用法介绍

    本文将从多个方面对Python周杰伦代码进行详细的阐述。 一、代码介绍 from urllib.request import urlopen from bs4 import Bea…

    编程 2025-04-29
  • Python计算阳历日期对应周几

    本文介绍如何通过Python计算任意阳历日期对应周几。 一、获取日期 获取日期可以通过Python内置的模块datetime实现,示例代码如下: from datetime imp…

    编程 2025-04-29
  • 如何查看Anaconda中Python路径

    对Anaconda中Python路径即conda环境的查看进行详细的阐述。 一、使用命令行查看 1、在Windows系统中,可以使用命令提示符(cmd)或者Anaconda Pro…

    编程 2025-04-29
  • 蝴蝶优化算法Python版

    蝴蝶优化算法是一种基于仿生学的优化算法,模仿自然界中的蝴蝶进行搜索。它可以应用于多个领域的优化问题,包括数学优化、工程问题、机器学习等。本文将从多个方面对蝴蝶优化算法Python版…

    编程 2025-04-29
  • Python读取CSV数据画散点图

    本文将从以下方面详细阐述Python读取CSV文件并画出散点图的方法: 一、CSV文件介绍 CSV(Comma-Separated Values)即逗号分隔值,是一种存储表格数据的…

    编程 2025-04-29
  • Python实现画笔方向改变

    本文将介绍如何在Python中实现画笔方向改变,让画笔以中心为轴旋转。 一、Tkinter库概述 Tkinter是Python自带的GUI库,可用于创建各种GUI应用程序。在Pyt…

    编程 2025-04-29
  • 运维Python和GO应用实践指南

    本文将从多个角度详细阐述运维Python和GO的实际应用,包括监控、管理、自动化、部署、持续集成等方面。 一、监控 运维中的监控是保证系统稳定性的重要手段。Python和GO都有强…

    编程 2025-04-29
  • Python清华镜像下载

    Python清华镜像是一个高质量的Python开发资源镜像站,提供了Python及其相关的开发工具、框架和文档的下载服务。本文将从以下几个方面对Python清华镜像下载进行详细的阐…

    编程 2025-04-29

发表回复

登录后才能评论