python直接赋值、浅拷贝与深拷贝

news/2024/11/8 0:43:15/

本文主要参考这篇博文python浅拷贝与深拷贝

基本概念

首先了解python中的一些基本概念

  • 变量:是一个系统表的元素,拥有指向对象的连接空间
  • 对象:被分配的一块内存,存储其所代表的值
  • 引用:是自动形成的从变量到对象的指针(一个动作)
  • 类型:属于对象,而非变量
  • 可变对象(重点):可以修改的对象,包括列表、字典、集合
  • 不可变对象(重点):一旦创建就不可修改的对象,包括字符串、元组、数值类型

深浅拷贝主要与可变对象和不可变对象有关,可变对象表明其指向内存中的值可以改变,当修改变量值时,其指向的内容空间中的值直接修改,并没有开辟新地址;不可变对象改变后,其所指的值不能被改变,相当于“抛弃”了原来地址中的值,重新开辟了一块地址进行赋值,并指向该地址

拷贝方法

对象的拷贝主要有三种方法

  • 直接赋值:赋值的是对象的引用
  • 浅拷贝(copy):拷贝父对象,不会拷贝对象内部的子对象
  • 深拷贝(deepcopy):引入copy模块的deepcopy方法,完全拷贝父对象与子对象

可变对象的拷贝

可变对象有列表、字典和集合,下面展示一个例子: 例子来源

字典的浅拷贝

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

字典的深拷贝

>>>import copy
>>> c = copy.deepcopy(a)
>>> a, c
({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})
>>> a[1].append(5)
>>> a, c
({1: [1, 2, 3, 4, 5]}, {1: [1, 2, 3, 4]})

深浅拷贝的图示解释如下

  • 赋值引用b=a: a和b指向同一对象
  • 浅拷贝b=a.copy(): a和b是独立的对象,但他们的子对象还是指向同一对象,也就是说改变其中任何一个子对象,两个值均发生改变
  • 深拷贝b=copy.deepcopy(a): a和b完全拷贝了父对象及其子对象,两者是完全独立的

其中红色部分代表两个变量的共有部分,即修改一个另一个也随之变化;黑色部分是独立部分

更多实例

import copy
a = [1, 2, 3, 4, ['a', 'b']] #原始对象b = a                       #赋值,传对象的引用
c = copy.copy(a)            #对象拷贝,浅拷贝
d = copy.deepcopy(a)        #对象拷贝,深拷贝a.append(5)                 #修改对象a
a[4].append('c')            #修改对象a中的['a', 'b']数组对象print( 'a = ', a )
print( 'b = ', b )
print( 'c = ', c )
print( 'd = ', d )'''
('a = ', [1, 2, 3, 4, ['a', 'b', 'c'], 5])
('b = ', [1, 2, 3, 4, ['a', 'b', 'c'], 5])
('c = ', [1, 2, 3, 4, ['a', 'b', 'c']])
('d = ', [1, 2, 3, 4, ['a', 'b']])
'''

不可变对象的拷贝

不可变对象的深浅拷贝就不重要了,因为地址本身的内容是不可变的,所以如果我们要改变变量的值,就必须改变其地址,类似于可变对象中的深拷贝

a = (1,2,3)
b = a
'''
# 值 地址
(1, 2, 3)  139964652002432
(1, 2, 3)  139964652002432
'''a = (4,5,6)
'''
(4, 5, 6)  139964652227904  # a的地址发生改变
(1, 2, 3)  139964652002432
'''

http://www.ppmy.cn/news/11447.html

相关文章

118页4万字智慧检务大数据平台解决方案

【版权声明】本资料来源网络,知识分享,仅供个人学习,请勿商用。【侵删致歉】如有侵权请联系小编,将在收到信息后第一时间删除!完整资料领取见文末,部分资料内容: 目录 第1章 前言 1.1、 政策背…

JAVA中的for循环使用方法

一. 循环结构1. 概念在学习Java里的循环之前,我们先来了解一下到底什么是循环,以及循环的作用。我们先来看下面这张图:大家想一下,我们在400米的跑道上参加万米长跑,正常情况下要跑25圈,这25圈每一圈的跑步…

数据结构基础——认识数据结构与算法

目录 🍔什么是数据结构? 🌭1.数据的逻辑结构 🌭NUM 1 : 集合 🌭NUM 2 : 线性结构 🌭NUM 2 : 树形结构 🌭NUM 4 :图结构(网状结构)…

nacos 2.1.0集群生产环境多节点部署

nacos 2.1.0集群生产环境多节点部署 版本 2.1.0版本发布日期 2022-04-29官网 集群部署说明GitHub GitHub - alibaba/nacos: an easy-to-use dynamic service discovery, configuration and service management platform for building cloud native applications. 下载地址&…

前端优化原理篇(生命周期)

1, 性能评估模型 对于前端的性能的评判 主要是以下四个方面: 2,性能测量工具 1,浏览器的performarce功能 指路可看链接 2,lighthouse工具 3,生命周期 网站 页面的整个生命周期,通俗的讲&a…

《回眸2022·圆满收官||展望2023·砥砺奋发》

系列文章目录 文章目录系列文章目录寄言和CSDN相遇大学生活从小白到千粉博主回眸2022|圆满收官展望2023|砥砺奋发致每一个追梦人寄言 岁月不距,时节如流!站在岁末的门槛前,回望2022这一年,不知你是否已经完美的书写完2022的答卷&…

IndexedDB介绍

文章目录一、参考链接二、概念1、数据库2、对象仓库3、数据记录4、索引5、事务三、IndexedDB 把不同的实体,抽象成一个个对象接口四、注意事项1、event一、参考链接 优秀文章:http://www.ruanyifeng.com/blog/2018/07/indexeddb.html官网:ht…

无桥PFC的家族推演

1. 组合法构建无桥PFC PFC是一种AC-DC变换器,将交流输入电压分成正负半周,输出电压是直流,因此AC-DC变换器可以当做是两个DC-DC变换器的组合。在PFC的拓扑推演中,就是设计两个DC-DC变换器的工作模式。以下内容是基于对陈正格博士发…