详解Python中深浅拷贝的使用及注意事项

yizhihongxing

详解Python中深浅拷贝的使用及注意事项

什么是深浅拷贝?

在Python中,拷贝是指将一个变量赋值给另一变量,以便于两个变量在内存中是不同的,但是它们的值相同。

深拷贝是指拷贝一个对象的副本,不管这个对象有多少个嵌套的对象(例如,一个 list 中还包含另一个 list),所有嵌套的对象都会被拷贝到新的对象中。

浅拷贝是指拷贝一个对象的引用,如果这个对象有嵌套的对象,就不会被拷贝到新的对象中,而只是被引用。

如何进行深浅拷贝?

Python中深浅拷贝有两种方法,一种是通过模块函数进行拷贝,另外一种是通过对象的方法进行拷贝。

使用模块函数进行拷贝

  • 浅拷贝

使用copy模块函数进行浅拷贝,可以使用以下代码实现:

import copy

lst = [1, [2, 3], 4]
lst_copy = copy.copy(lst)

# 改变lst中嵌套的列表中的值
lst[1][0] = 0

print(lst)  # [1, [0, 3], 4]
print(lst_copy)  # [1, [0, 3], 4]

通过运行上述代码可以看到,lst_copy 只是一个lst的浅拷贝,那么当lst中嵌套的列表中的值改变时,lst_copy的嵌套列表中的值也会改变。

  • 深拷贝

使用copy模块函数进行深拷贝,可以使用以下代码实现:

import copy

lst = [1, [2, 3], 4]
lst_copy = copy.deepcopy(lst)

# 改变lst中嵌套的列表中的值
lst[1][0] = 0

print(lst)  # [1, [0, 3], 4]
print(lst_copy)  # [1, [2, 3], 4]

通过运行上述代码可以看到,lst_copy 是 lst 的深拷贝,随着lst中嵌套的列表中的值改变,lst_copy的值并不会改变。

使用对象的方法进行拷贝

对于列表和字典,还可以使用对象的方法进行拷贝。

  • 浅拷贝

列表中的浅拷贝可以使用以下代码实现:

lst = [1, [2, 3], 4]
lst_copy = lst.copy()

# 改变lst中嵌套的列表中的值
lst[1][0] = 0

print(lst)  # [1, [0, 3], 4]
print(lst_copy)  # [1, [0, 3], 4]

通过运行上述代码可以看到,lst_copy也是lst的浅拷贝,当lst中嵌套的列表中的值改变时,lst_copy的嵌套列表中的值也会改变。

  • 深拷贝

列表中的深拷贝可以使用以下代码实现:

import copy

lst = [1, [2, 3], 4]
lst_copy = lst.__class__(copy.deepcopy(i) for i in lst)

# 改变lst中嵌套的列表中的值
lst[1][0] = 0

print(lst)  # [1, [0, 3], 4]
print(lst_copy)  # [1, [2, 3], 4]

通过运行上述代码可以看到,lst_copy 是 lst 的深拷贝,随着lst中嵌套的列表中的值改变,lst_copy的值并不会改变。

注意事项

  • 拷贝的值可以是任意的Python对象,包括列表、字典、元组等;
  • 浅拷贝只是复制了最外层的对象,而嵌套在其中的对象不会一起被复制,仍然指向原对象;
  • 深拷贝则会将嵌套的对象都复制一遍;
  • 如果使用深拷贝会消耗较多的时间和内存,因此应该谨慎使用。

示例说明

实例一

简单的深浅拷贝使用示例。

import copy

lst = [1, [2, 3], 4]
lst_copy = lst.copy()

lst_copy[0] = 5
lst_copy[1][0] = 6

print(lst)  # [1, [6, 3], 4]
print(lst_copy)  # [5, [6, 3], 4]

通过运行上述代码可以看到,lst_copy是lst的浅拷贝,当lst_copy中的值改变时,lst中嵌套列表的值也会改变。

实例二

使用字典进行深浅拷贝使用示例。

import copy

dic = {'a': 1, 'b': 2, 'c': {'d': 3, 'e': 4}}
dic_copy = copy.deepcopy(dic)

dic_copy['a'] = 5
dic_copy['c']['d'] = 6

print(dic)  # {'a': 1, 'b': 2, 'c': {'d': 3, 'e': 4}}
print(dic_copy)  # {'a': 5, 'b': 2, 'c': {'d': 6, 'e': 4}}

通过运行上述代码可以看到,dic_copy是dic的深拷贝,当dic_copy中的值改变时,dic中嵌套字典的值也会改变。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Python中深浅拷贝的使用及注意事项 - Python技术站

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

相关文章

  • python如何通过正则匹配指定字符开头与结束提取中间内容

    以下是“Python如何通过正则匹配指定字符开头与结束提取中间内容”的完整攻略: 一、问题描述 在处理文本数据时,我们经常需要从字符串中提取特定的内容。如果我们知道要提取的内容的开头和结尾字符,可以使用正则表达式来匹配并提取中间的内容。 二、解决方案 解决这个问题的方法是使用正则表达式的“捕获组”功能。我们可以使用圆括号将要匹配的内容括起来,然后使用grou…

    python 2023年5月14日
    00
  • python matplotlib画图时坐标轴重叠显示不全和图片保存时不完整的问题解决

    没问题。 Python中常用的绘图库matplotlib对于控制图形细节以及使用方便性都有很好的保障,但是在实际使用matplotlib画图时,经常会遇到一些比较棘手的问题,比如在坐标轴上出现标签重叠而导致无法完全显示,或者在保存图片时无法保存完整图形等问题。下面就给出一些解决这些问题的攻略。 1. 坐标轴重叠显示不全问题解决 问题出现的原因 当我们在mat…

    python 2023年5月18日
    00
  • 基于python3监控服务器状态进行邮件报警

    请允许我为您详细讲解如何基于 Python3 监控服务器状态并进行邮件报警。 简述 本教程将以 Python3 为基础编程语言,使用 psutil 库读取 Linux 系统相关硬件和软件信息,实现对服务器状态进行监控,并通过邮件进行报警。 实现的功能有: 监控 CPU 和内存使用率 监控磁盘使用率 监控进程是否宕掉 发送邮件进行报警 步骤 1. 安装 psu…

    python 2023年5月13日
    00
  • 使用python的pandas读取excel文件中的数据详情

    下面我来为您详细讲解如何使用Python的pandas读取Excel文件中的数据。 一、安装pandas库 首先,需要在电脑上安装pandas库。可以使用以下命令来安装: pip install pandas 二、读取Excel文件 读取Excel文件主要使用pandas库中的read_excel()函数。以下是一个示例: import pandas as …

    python 2023年5月13日
    00
  • Python openpyxl 无法保存文件的解决方案

    以下是“Python openpyxl 无法保存文件的解决方案”的完整攻略: 问题描述 当使用openpyxl库编写excel文档时,有时会遇到无法保存文件的问题,程序并未报错,但是保存后的文件却无任何变化。 解决方案 方案一:关闭Excel文件 如果您正在编辑的excel文档已经被打开,Python脚本试图修改该文件,将会导致openpyxl无法保存文件。…

    python 2023年6月5日
    00
  • python3利用ctypes传入一个字符串类型的列表方法

    当需要将一个字符串类型的列表传入C语言函数时,可以使用ctypes模块中的c_char_p类型和POINTER类型实现。下面是一个详细的攻略,介绍如何使用ctypes传入一个字符串类型的列表方法。 方法一:使用c_char_p类型 可以使用c_char_p类型来表示一个字符串类型的指针。在Python中,可以使用字符串的encode()方法将字符串转换为by…

    python 2023年5月13日
    00
  • 如何基于Python创建目录文件夹

    要基于Python创建目录文件夹,你可以运用Python内置的os模块或pathlib模块。下面将详细讲解两种方法: 1. 使用os模块创建文件夹 1.1 导入模块 import os 1.2 创建文件夹 可以使用os.mkdir()函数来创建单个文件夹,例如: os.mkdir(‘test_dir’) 如果要创建多层文件夹,则需要使用os.makedirs…

    python 2023年6月2日
    00
  • Python实现王者荣耀自动刷金币的完整步骤

    下面我将为您详细讲解Python实现王者荣耀自动刷金币的完整步骤,包含以下几个部分: 准备工作 安装WebDriver 编写Python代码 运行程序 注意事项 接下来我将详细说明每个步骤。 1. 准备工作 在开始之前,需要确保您的电脑上已经安装了Python 3.x,并且已经安装了Chrome浏览器。如果没有安装,您可以前往Python官网和Chrome浏…

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