详解Python的三种拷贝方式

详解Python的三种拷贝方式

在Python中,变量不是直接存储值,而是存储值所在内存地址的引用。因此,对变量的操作实际上是对内存中引用的操作。在进行赋值、传递参数等操作时,需要对内存中的数据进行拷贝。Python中有三种拷贝方式,分别是浅拷贝、深拷贝和赋值拷贝。

浅拷贝

浅拷贝只是拷贝对象的一层引用,也就是新对象中的列表、集合等容器对象中的元素,仍然是原对象中的引用。如果原对象中的某个元素发生了改变,则新对象中的对应元素也会发生改变。实现浅拷贝的方法有多种,如切片、copy()方法、工厂函数等。

切片

切片是Python中一种常用的浅拷贝方式,可以通过[:]实现。以列表为例:

a = [1, 2, 3, [4, 5]]
b = a[:]

这里b就是a的浅拷贝。我们可以尝试改变a中的子列表:

a[3][0] = 6

然后查看b:

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

可以看到,b中的子列表也被改变了,说明b只是拷贝了a中的元素引用,而非新创建了一个对象。

copy()方法

还可以使用列表、字典等的copy()方法实现浅拷贝。以字典为例:

a = {'a': 1, 'b': 2, 'c': [3, 4]}
b = a.copy()

同样地,我们改变a中的元素:

a['c'][0] = 5

再查看b:

print(b)   # {'a': 1, 'b': 2, 'c': [5, 4]}

同样发现b中的元素也被改变了。

深拷贝

深拷贝是在内存中完全克隆一个对象,不共享任何引用对象。因此,新对象的修改不会影响原对象。实现深拷贝的方法有多种,如copy模块的deepcopy()函数、pickle模块实现的序列化和反序列化等。

copy模块的deepcopy()函数

以列表为例:

import copy

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

这里b就是a的深拷贝。我们改变a中的子列表:

a[3][0] = 6

再查看b:

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

可以看到,b没有被改变,说明b是独立于a的。

赋值拷贝

赋值操作实际上是创建了一个新的变量名和原变量名指向相同的对象,因此它们共享一个内存地址。这种方式不属于拷贝,只是创建了一个引用。

以列表为例:

a = [1, 2, 3]
b = a

这里b只是a的引用,我们修改a:

a.append(4)

再查看b:

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

可以看到,b也被改变了。

总结

在Python中,对容器对象进行操作时,需要注意拷贝方式的选择,以避免意外的副作用。浅拷贝适用于不可变对象或单层修改的情况;深拷贝适用于需要完全克隆对象的情况;赋值拷贝适用于不需要拷贝的情况。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Python的三种拷贝方式 - Python技术站

(0)
上一篇 2023年5月13日
下一篇 2023年5月13日

相关文章

  • python实现冒泡排序算法的两种方法

    冒泡排序是一种简单的排序算法,它的基本思想是重复地遍历要排序的列表,比较相邻的两个元素,并按照大小交换它们的位置,直到整个列表都是有序的。在Python中,我们可以使用两种方法来实现冒泡排序算法。 方法一:使用两个循环实现冒泡排序 以下是使用两个循环实现冒泡排序的Python代码示例: def bubble_sort(arr): n = len(arr) f…

    python 2023年5月13日
    00
  • 在Python下使用Txt2Html实现网页过滤代理的教程

    使用Txt2Html实现网页过滤代理的教程 1. 简介 Txt2Html是一个将纯文本文件转换为HTML格式的工具,可以快速将txt格式的文件转换为html格式的文件。在Python下使用Txt2Html可以实现网页过滤代理的功能,将一些敏感信息进行过滤,然后再通过代理将过滤后的内容转发出去。下面是详细教程。 2. 安装Txt2Html 使用pip命令安装T…

    python 2023年5月18日
    00
  • python编写脚本之pyautogui的安装和使用教程

    Python编写脚本之pyautogui的安装和使用教程 1. 简介 PyAutoGUI 是一款 Python 模块,用于控制鼠标和键盘,以完成自动化操作和图形用户界面测试。使用 PyAutoGUI 可以编写脚本程序实现鼠标和键盘的模拟,实现自动化任务,例如批量处理文件、自动化测试等。 2. 安装 PyAutoGUI 的安装很简单,使用 pip 工具即可完成…

    python 2023年5月19日
    00
  • 关于Pycharm安装第三方库超时 Read time-out的问题

    当在Pycharm中安装第三方库时,有时会出现“Read timed out”的错误,这是因为在下载过程中连接超时导致的。以下是解决此问题的完整攻略。 问题原因 Pycharm在安装第三方库时,会从PyPi(Python Package Index)进行下载。但是由于网络原因或服务器端限制,可能会导致下载过程中连接超时。 解决方法 方法一:更改PyPi镜像源…

    python 2023年5月13日
    00
  • Python lxml解析HTML并用xpath获取元素的方法

    在Python中,可以使用lxml库解析HTML文档,并使用XPath语法获取元素。本文将详细讲解Python基于lxml解析HTML并用XPath获取元素的方法,包括两个示例。 示例一:获取指定标签的元素 以下是一个示例代码,演示如何使用lxml解析HTML文档,并使用XPath语法获取指定标签的元素: from lxml import etree htm…

    python 2023年5月15日
    00
  • python 定时修改数据库的示例代码

    下面为您讲解Python定时修改数据库的完整攻略。 1. 设置定时任务 我们可以使用Python中的sched模块来设置周期性的任务。下面是一个示例代码: import time import sched def action(): print("Do some actions") scheduler = sched.scheduler(…

    python 2023年6月2日
    00
  • Python安装spark的详细过程

    安装Python并不是安装Spark的必需步骤,因为Python和Spark是两个独立的组件。但是,安装Python是进行数据分析、数据处理和机器学习时常用的一个语言。因此,我们在这里提供一个Python安装Spark的详细过程攻略。 安装Python 首先,我们需要在计算机上安装Python。Python有两个主要版本:Python 2和Python 3。…

    python 2023年5月14日
    00
  • 深入浅析正则表达式re模块(部分)

    深入浅析正则表达式re模块(部分) 正则表达式(Regular Expression)是一种描述字符串规则的方式,类型不仅仅局限于Python,而是能够跨语言使用。在Python中,使用正则表达式需要re模块支持。 re的基本用法 re模块提供了两种基本操作:匹配和搜索。 匹配 使用re模块的match()函数进行匹配,该函数可以在字符串的开头进行匹配。如果…

    python 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部