详解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中非常常用,有很多方法可以实现字符串连接的功能。在本篇攻略中,我们将详细介绍Python中常用的字符串连接方法,并提供一些示例说明。 1. “+”操作符 使用“+”操作符可以将两个字符串连接成一个新字符串。该操作符可以同时连接两个字符串,也可以连接多个字符串。 示例代码如下: str1 = "…

    python 2023年6月7日
    00
  • Python基础教程之while循环用法讲解

    Python基础教程之while循环用法讲解 1. 什么是while循环 在Python中,while循环是一种常见的循环结构,使用该结构可以重复执行一段代码,直到达成某个条件为止。 2. while循环的基本语法 while 条件: 循环体语句 其中,条件为一个布尔表达式,如果满足该条件,则执行循环体语句。当条件变为False时,则退出循环。 3. whi…

    python 2023年6月5日
    00
  • 浅谈Python的文件类型

    浅谈Python的文件类型 Python中经常用到的文件类型主要有以下几种: .py文件 Python源代码的文件类型,使用文本编辑器进行编写。以.py作为文件后缀名,可通过Python解释器运行。 .txt文件 文本文件,用于存储文本信息,可以使用Python内置的open函数进行文件读写操作。 示例代码: #以可写方式打开文件 f = open(‘exa…

    python 2023年6月5日
    00
  • python 用递归实现通用爬虫解析器

    Python用递归实现通用爬虫解析器 在爬虫编写过程中,解析器的编写是一个必不可少的环节。不同的网站页面结构可能会不一样,因此编写通用爬虫解析器可以提高代码的复用性。本文将介绍如何使用Python中的递归算法实现通用爬虫解析器的功能。 具体步骤 分析网页结构,确定爬取的目标元素的标签和类名。 使用Python中的Requests库获取网页的源代码。 使用Py…

    python 2023年5月14日
    00
  • Python中os.path用法分析

    Python中os.path用法分析 在Python的标准库os模块中,通过os.path子模块可以对文件路径或目录进行操作。os.path提供了一些常用的方法用于操作目录,例如获取目录名、获取文件路径、判断路径是否存在等等。下文将对os.path进行详细的讲解。 os.path模块简介 os.path模块是Python的内置模块,提供了一些常用的方法用以处…

    python 2023年6月2日
    00
  • Python中DataFrame与内置数据结构相互转换的实现

    要在Python中进行数据分析,pandas是一款非常常用的数据分析工具。其中,DataFrame作为pandas中最核心的数据结构之一,具有类似于Excel电子表格的功能,可以处理数据的过滤、排序、变换等操作。不过,在实际开发中,我们可能需要在DataFrame和内置数据结构之间相互转换,本文将详细讲解如何实现这个功能。 1. DataFrame与Nump…

    python 2023年6月3日
    00
  • 适合模拟python

    【问题标题】:Fit a simulation python适合模拟python 【发布时间】:2023-04-01 09:47:01 【问题描述】: 鉴于模型蛮力的参数数量是不可能的,我正在尝试将模拟拟合到经验数据。有哪些可用于模拟的资源?模拟是一个 python 函数(不要与数学函数混淆),它输出一个列表。我希望这个列表尽可能接近其他列表(经验数据)。 …

    Python开发 2023年4月8日
    00
  • Linux下安装PocketSphinx

    下面是安装PocketSphinx的完整攻略: 1. 安装依赖软件包 在安装PocketSphinx之前,我们需要安装一些依赖软件包,包括cmake、autoconf、libtool、bison、swig等。在终端(Terminal)中输入如下命令即可: sudo apt-get install cmake autoconf libtool bison sw…

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