当前位置:首页 > 科技  > 软件

解析Python的深浅拷贝机制

来源: 责编: 时间:2023-11-08 17:03:02 174观看
导读在Python编程中,我们经常会遇到数据复制的问题。有时候,我们只是需要复制一份数据的引用,有时候,我们则需要复制数据本身。这就涉及到了Python中的深浅拷贝问题。深浅拷贝是Python中的一个重要概念,理解它对于编写高效的Py

在Python编程中,我们经常会遇到数据复制的问题。有时候,我们只是需要复制一份数据的引用,有时候,我们则需要复制数据本身。这就涉及到了Python中的深浅拷贝问题。深浅拷贝是Python中的一个重要概念,理解它对于编写高效的Python代码至关重要。本文将深入探讨Python的深浅拷贝,帮助你更好地理解和使用这一重要概念。Mrt28资讯网——每日最新资讯28at.com

Mrt28资讯网——每日最新资讯28at.com

一、理解深浅拷贝

再了解深浅拷贝之前,我们手续爱你需要了解一下什么是赋值?Mrt28资讯网——每日最新资讯28at.com

1. 赋值

所谓赋值,就是将对象与变量名字进行绑定,称为名字绑定; 在 Python 中,变量只是一个与实际对象绑定起来的名字,变量定义本质上就是建立名字与对象的约束关系。因此,赋值语句本质上就是建立这样的约束关系,将右边的对象与左边的名字绑定在一起:Mrt28资讯网——每日最新资讯28at.com

a = 1

除了赋值语句,还有哪些语句可以完成名字绑定?Mrt28资讯网——每日最新资讯28at.com

(1) 模块导入Mrt28资讯网——每日最新资讯28at.com

我们导入模块时,也会在当前上下文创建一个名字,并与被导入对象绑定:Mrt28资讯网——每日最新资讯28at.com


Mrt28资讯网——每日最新资讯28at.com

Mrt28资讯网——每日最新资讯28at.com

import xxxfrom xxx import yyy

(2) 函数类定义Mrt28资讯网——每日最新资讯28at.com

Mrt28资讯网——每日最新资讯28at.com

我们定义函数/类时,本质上是创建了一个函数/类对象,然后将其与函数/类名绑定:Mrt28资讯网——每日最新资讯28at.com

Mrt28资讯网——每日最新资讯28at.com

def circle_area(r):    return PI * r ** 2class Dog(object):    pass

Mrt28资讯网——每日最新资讯28at.com

(3) as 关键字Mrt28资讯网——每日最新资讯28at.com

Mrt28资讯网——每日最新资讯28at.com

除此此外, as 关键字也可以在当前上下文建立名字约束关系:Mrt28资讯网——每日最新资讯28at.com

import xxx as yyyfrom xxx import yyy as zzzwith open('/some/file') as f:    passtry:    # do somethingexcept SomeError as e:    # handle error

2. 深浅拷贝

首先我们要知道什么是深拷贝?什么是浅拷贝?Mrt28资讯网——每日最新资讯28at.com

  • 深拷贝:创建一个新的对象,并将原对象的数据复制到新对象中。这意味着对新对象的修改不会影响原对象。
  • 浅拷贝:创建一个新的对象,但只复制原对象的数据引用,而不是数据本身。这意味着对新对象的修改可能会影响原对象。

了解完基本概念之后,那么问题来了,如何判断一个对象是深拷贝还是浅拷贝?Mrt28资讯网——每日最新资讯28at.com

可以使用is运算符来判断两个对象是否相同。如果两个对象是相同的,那么它们可能是浅拷贝;如果不同,那么它们可能是深拷贝。Mrt28资讯网——每日最新资讯28at.com

浅拷贝就是拷贝对象的 引用指针,二者元素是相同的对象。如列表l1, 当创建列表l2时,浅拷贝自l1,那么知识拷贝了其中元素的引用。 修改可变类型时,指针指向同一对象,都会发生改变。Mrt28资讯网——每日最新资讯28at.com

二、Python中的copy模块

1. copy模块的作用和使用

  • copy模块提供了一些用于创建浅拷贝和深拷贝的函数。
  • copy.copy():创建一个新的对象,并将原对象的数据复制到新对象中。这是浅拷贝。
  • copy.deepcopy():创建一个新的对象,并将原对象的数据以及其包含的所有子对象的数据都复制到新对象中。这是深拷贝。

浅拷贝的简单示例一:Mrt28资讯网——每日最新资讯28at.com

l1 = [1,[2],'tree']print(l1)l2 = l1.copy()print(l2)print(id(l1),id(l2))# [1, [2], 'tree']# [1, [2], 'tree']# 1248669925248 1248669924928

Mrt28资讯网——每日最新资讯28at.com

示例二:Mrt28资讯网——每日最新资讯28at.com

l1 = [1,[2],'tree']l2 = l1.copy()l2[0] = 'one'print(l2)print(l1)# ['one', [2], 'tree']# [1, [2], 'tree']l2[1][0] = 'two'print(l2)print(l1)# ['one', ['two'], 'tree']# [1, ['two'], 'tree']

Mrt28资讯网——每日最新资讯28at.com

深拷贝的示例:Mrt28资讯网——每日最新资讯28at.com

# 就是不止拷贝指针,连对象也会拷贝,创建出来一份新的,完全独立l = [1, [2], 'three']print(l)from copy import deepcopyl2 = deepcopy(l)print(l2)# 修改新列表不会影响旧列表l2[1][0] = 'two'print(l2)print(l)# [1, [2], 'three']# [1, [2], 'three']# [1, ['two'], 'three']# [1, [2], 'three']

2. 深浅拷贝的区别和使用

  • copy.copy()只复制原对象的数据引用,而copy.deepcopy()则复制数据本身。
  • copy.copy()适用于只需要复制数据引用的情况,而copy.deepcopy()适用于需要复制数据本身的情况。

如下所示:Mrt28资讯网——每日最新资讯28at.com

import copya = [1, 2, 3, [4, 5], 6]b = ac = copy.copy(a)d = copy.deepcopy(a)b.append(10)c[3].append(11)d[3].append(12)print(a)print(b)print(c)print(d)# [1, 2, 3, [4, 5,11], 6,10]# [1, 2, 3, [4, 5,11], 6,10]# [1, 2, 3, [4, 5,11], 6]# [1, 2, 3, [4, 5,12], 6]

Mrt28资讯网——每日最新资讯28at.com

注意:对于非容器类型,如数字、字符,以及其他的“原子”类型,没有拷贝一说,产生的都是原对象的引用Mrt28资讯网——每日最新资讯28at.com

三、深浅拷贝拓展

1. 深浅拷贝的应用

何时应该使用浅拷贝?何时应该使用深拷贝?Mrt28资讯网——每日最新资讯28at.com

  • 当只需要复制数据引用时,使用浅拷贝可以节省内存和计算资源。
  • 当需要确保对新对象的修改不会影响原对象时,使用深拷贝。

深浅拷贝在实际编程中的应用案例::Mrt28资讯网——每日最新资讯28at.com

  • 浅拷贝:对嵌套列表进行修改时,原始嵌套列表也会被修改。
  • 深拷贝:对嵌套列表进行修改时,原始嵌套列表不会被修改。
  • 浅拷贝:对列表进行切片操作时,原始列表也会被修改。
  • 深拷贝:对列表进行切片操作时,原始列表不会被修改。
  • 示例1:列表的浅拷贝和深拷贝
  • 示例2:嵌套列表的深浅拷贝

Mrt28资讯网——每日最新资讯28at.com

2. 避免深浅拷贝带来的问题

深浅拷贝可能带来的问题:Mrt28资讯网——每日最新资讯28at.com

  • 浅拷贝可能导致意外地修改原始对象。
  • 深拷贝可能导致不必要的内存消耗和计算资源浪费。

如何避免这些问题:Mrt28资讯网——每日最新资讯28at.com

  • 根据实际需求选择合适的拷贝方式。
  • 如果不确定是否需要深拷贝,可以先使用浅拷贝,并在必要时进行验证。

总结

通过对Python深浅拷贝的深入学习和实践,我们可以更好地理解Python的数据复制机制,提高我们的编程效率和代码质量。希望本文能帮助你掌握深浅拷贝的概念和应用,使你在Python编程的道路上更进一步。Mrt28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-17763-0.html解析Python的深浅拷贝机制

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Python初识:函数的参数

下一篇: Python模块化开发:构建可重用、可维护的代码

标签:
  • 热门焦点
  • Mate60手机壳曝光 致敬自己的经典设计

    Mate60手机壳曝光 致敬自己的经典设计

    8月3日消息,今天下午博主数码闲聊站带来了华为Mate60的第三方手机壳图,可以让我们在真机发布之前看看这款华为全新旗舰的大致轮廓。从曝光的图片看,Mate 60背后摄像头面积依然
  • 6月iOS设备好评榜:第一蝉联榜首近一年

    6月iOS设备好评榜:第一蝉联榜首近一年

    作为安兔兔各种榜单里变化最小的那个,2023年6月的iOS好评榜和上个月相比没有任何排名上的变化,仅仅是部分设备好评率的下降,长年累月的用户评价和逐渐退出市场的老款机器让这
  • 28个SpringBoot项目中常用注解,日常开发、求职面试不再懵圈

    28个SpringBoot项目中常用注解,日常开发、求职面试不再懵圈

    前言在使用SpringBoot开发中或者在求职面试中都会使用到很多注解或者问到注解相关的知识。本文主要对一些常用的注解进行了总结,同时也会举出具体例子,供大家学习和参考。注解
  • 如何使用JavaScript创建一只图像放大镜?

    如何使用JavaScript创建一只图像放大镜?

    译者 | 布加迪审校 | 重楼如果您曾经浏览过购物网站,可能遇到过图像放大功能。它可以让您放大图像的特定区域,以便浏览。结合这个小小的重要功能可以大大改善您网站的用户体验
  • 腾讯盖楼,字节拆墙

    腾讯盖楼,字节拆墙

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之“想重温暴刷深渊、30+技能搭配暴搓到爽的游戏体验吗?一起上晶核,即刻暴打!”曾凭借直播腾讯旗下代理格斗游戏《DNF》一
  • 三星获批量产iPhone 15全系屏幕:苹果史上最惊艳直屏

    三星获批量产iPhone 15全系屏幕:苹果史上最惊艳直屏

    按照惯例,苹果将继续在今年9月举办一年一度的秋季新品发布会,有传言称发布会将于9月12日举行,届时全新的iPhone 15系列将正式与大家见面,不出意外的话
  • 微软发布Windows 11新版 引入全新任务栏状态

    微软发布Windows 11新版 引入全新任务栏状态

    近日,微软发布了Windows 11新版,而Build 22563更新主要引入了几周前曝光的平板模式任务栏等,系统更流畅了。更新中,Windows 11加入了专门针对平板优化的任务栏
  • 由于成本持续增加,笔记本产品价格预计将明显上涨

    由于成本持续增加,笔记本产品价格预计将明显上涨

    根据知情人士透露,由于材料、物流等成本持续增加,笔记本产品价格预计将在2021年下半年有明显上涨。进入6月下旬以来,全球半导体芯片缺货情况加剧,显卡、处理器
  • 电博会与软博会实现

    电博会与软博会实现"线下+云端"的双线融合

    在本次“电博会”与“软博会”双展会利好条件的加持下,既可以发挥展会拉动人流、信息流、资金流实现快速交互流动的作用,继而推动区域经济良性发展;又可以聚
Top