Python 的赋值,浅拷贝和深拷贝详解

yizhihongxing

Python 的赋值、浅拷贝和深拷贝详解

赋值、浅拷贝和深拷贝是 Python 中经常涉及的概念,也是容易混淆的概念。本文将详细讲解这三个概念的定义、区别和示例说明。

赋值

赋值是将一个对象的引用复制给另一个变量,让它指向同一个对象。例如:

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

前面的语句将 [1, 2, 3] 这个列表对象赋值给了 a 变量,而 b 变量则将 a 变量的引用复制一份成为自己的引用。这时候 ab 两个变量都指向同一个列表对象。修改 ab 变量所指向的列表,另一个变量所指向的列表也会发生相应的变化。

a[0] = 0
print(a)  # [0, 2, 3]
print(b)  # [0, 2, 3]

浅拷贝

浅拷贝是创建一个新的对象,但是新对象作为容器只包括原对象的引用。例如:

import copy

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

与赋值不同的是,浅拷贝是通过对原对象的某些层次进行复制,创建一个新的对象,并将原对象中的引用复制到新对象中。在这个过程中,新对象与原对象共享内部列表这样的可变对象。当修改内部的可变对象时,两个变量所指向的列表不同,但是它们所包含的对象相同。

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

深拷贝

深拷贝是创建一个新的对象,包括原对象及其所有子对象的拷贝。例如:

import copy

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

深拷贝与浅拷贝的区别在于对于原对象的子对象,深拷贝将递归地进行子对象的复制,创建一整个新的对象,而浅拷贝仅仅是对子对象内层的引用进行复制,会影响子对象中共享的可变对象。

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

由于深拷贝是递归进行的,当对象的层次很深或者包含循环引用时,深拷贝的性能会变得很低。这时候可以考虑使用其他的方法来减少拷贝的次数。

示例说明

示例一

import copy

a = [1, 2, [3, 4]]
b = a  # 赋值
c = copy.copy(a)  # 浅拷贝
d = copy.deepcopy(a)  # 深拷贝

a[0] = 0
a[2][0] = 0

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

在这个示例中,我们创建了一个嵌套列表的对象,并通过赋值、浅拷贝和深拷贝分别创建了三个新的变量。我们修改了 a 变量所指向的列表对象的元素值,即 [1, 2, [3, 4]] -> [0, 2, [0, 4]]。并且,我们也修改了 a 变量所指向的列表对象中的嵌套列表对象的元素值,即 [3, 4] -> [0, 4]。我们可以看到,赋值和浅拷贝得到的变量所指向的列表对象同样发生了变化,而深拷贝得到的变量所指向的列表对象不受影响。

示例二

import copy

a = [1, 2]
b = [3, 4]
c = [a, b]
d = [a, b]
e = copy.copy(c)
f = copy.deepcopy(c)

print(c is d)  # False
print(c == d)  # True

a[0] = 0
print(c)  # [[0, 2], [3, 4]]
print(d)  # [[1, 2], [3, 4]]
print(e)  # [[0, 2], [3, 4]]
print(f)  # [[1, 2], [3, 4]]

在这个示例中,我们创建了两个嵌套列表的对象,并将它们组成一个新的嵌套列表对象。我们使用了赋值、浅拷贝和深拷贝分别创建了三个新的嵌套列表对象。我们设置了 cd 变量分别指向同样的嵌套列表对象。我们修改了 a 变量所指向的列表对象的元素值,即 [1, 2] -> [0, 2]。我们用 is 判断了 cd 变量是否指向同样的列表对象,结果为 False。我们可以看到,浅拷贝得到的变量所指向的嵌套列表对象虽然不受 内部可变对象 的影响,但是共享同样的父对象;而深拷贝得到的变量所指向的嵌套列表对象完全独立,不受任何对象的影响。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python 的赋值,浅拷贝和深拷贝详解 - Python技术站

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

相关文章

  • Python基础之常用库常用方法整理

    Python基础之常用库常用方法整理 Python是一门通用编程语言,拥有丰富的标准库和第三方库,可以实现众多功能。本文主要介绍Python常用的一些标准库和常用方法,帮助读者更有效地使用Python进行开发。 常用库 1. os库 os库提供了一种平台独立的方法来使用操作系统功能。它主要用于和操作系统交互,比如文件读写、目录操作等。下面是一些常用的方法。 …

    python 2023年5月18日
    00
  • Python实现简单状态框架的方法

    本文将为你详细介绍在Python中实现简单状态框架的方法。 什么是状态框架? 状态框架(State Machine, 状态机)是一种计算机程序框架,被广泛应用于通信、控制以及自动化等领域中。它把问题建模为一组离散的状态,然后使用转换规则通过状态转移来实现对系统行为的描述。 Python实现简单状态框架的方法 在Python中,实现状态框架通常会使用有限状态机…

    python 2023年6月6日
    00
  • python中wordcloud安装的方法小结

    这里是关于“python中wordcloud安装的方法小结”的完整攻略。 1. 安装wordcloud模块 要在Python中使用wordcloud,需要首先安装wordcloud模块。常用的方法是使用pip命令进行安装: pip install wordcloud 对于在Windows系统中使用Anaconda的Python用户,也可以使用conda命令进…

    python 2023年5月20日
    00
  • Python os.mkdir()与os.makedirs()的使用区别

    当我们需要在Python脚本中创建一个文件夹时,可以使用Python内置的os模块中提供的os.mkdir()函数或os.makedirs()函数。这两个函数都用于在指定路径创建新目录,但它们之间有一些区别,本文将详细介绍其使用区别。 os.mkdir() os.mkdir()函数用来创建单层目录,即在指定路径上创建一个新目录,如果路径的上级目录不存在,则会…

    python 2023年6月2日
    00
  • python3 如何解压缩.gz文件

    当我们遇到一个.gz格式的压缩文件时,需要先解压缩该文件,才能获得其中的内容。下面是python3 如何解压缩.gz文件的完整攻略: Step 1:导入gzip模块 gzip模块可用于解压缩.gz文件,首先需要先导入该模块。代码如下: import gzip Step 2:打开.gz文件 将.gz文件解压缩前,需要先将其打开。使用gzip模块下的open()…

    python 2023年6月3日
    00
  • 实例讲解Python中浮点型的基本内容

    实例讲解Python中浮点型的基本内容 基本知识 在Python中,浮点数是指“带小数点的数字”,例如2.0、3.14等。Python中的浮点数是可变精度的,即表示的精度不会有限制,但这也使得它的精度受限于所占用的内存。 Python中浮点数的表示方法与科学计数法类似,采用“尾数×基数的指数幂”的形式,即: 0.618 × 10 ^ 2 其中,0.618为尾…

    python 2023年6月5日
    00
  • Python中Permission denied的解决方案

    在Python中,当我们尝试访问或修改文件或目录时,有时会遇到Permission denied错误。这通常是由于文件或目录的权限设置不正确所致。以下是决Python中Permission denied错误的完整攻略: 1. 检查文件或目录权限 当我们尝试访问或修改文件或目录时,应该确保文件或目录权限设置正确。我们可以使用以下命令来检查文件或目录的权限设置:…

    python 2023年5月13日
    00
  • python中通过pip安装库文件时出现“EnvironmentError: [WinError 5] 拒绝访问”的问题及解决方案

    当我们在使用 Python 的 pip 工具安装库文件时,有时会遇到 EnvironmentError: [WinError 5] Access is denied 的错误提示。这个错误提示意味着你没有足够的权限在指定的路径上进行写入,可能是由于管理员权限或文件系统权限等因素造成的。 下面是一些解决方法: 1. 以管理员权限运行cmd 有时候我们需要以管理员…

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