Python变量存储方式以及深浅拷贝

python篇-10-浅拷贝和深拷贝(图文详解) 首先我们要明确一下:变量存储在栈内存,对象存储在堆内存。 阅读详情

Python变量存储方式以及深浅拷贝

(关于学习廖雪峰Python教程的一些个人总结)

变量存储

Python是动态语言。

可以把任意数据类型赋值给变量,无需提前声明变量类型,同一个变量可以反复赋值,而且可以是不同类型的变量。

下面引用廖雪峰Python教程的简单例子,描述变量存储过程:

当我们写

a = 'ABC'

时,Python解释器干了两件事情:

  1. 在内存中创建了一个'ABC'的字符串;
  2. 在内存中创建了一个名为a的变量,并把它指向'ABC'。

下面程序

a = 'ABC'
b = a
a = 'XYZ'
print(b)
# >>> ABC

执行过程:

执行a = 'ABC',解释器创建了字符串'ABC'和变量a,并把a指向'ABC':

py-var-code-1

执行b = a,解释器创建了变量b,并把b指向a指向的字符串'ABC':

py-var-code-2

执行a = 'XYZ',解释器创建了字符串’XYZ’,并把a的指向改为'XYZ',但b并没有更改:

py-var-code-3

所以,最后打印变量b的结果是'ABC'了。


深浅拷贝

Python当中对于拷贝,按照拷贝数据类型分为两种类型。一种是数字和字符串的拷贝,另一种就是列表、元组、字典等其他数据结构类型的拷贝。

当然按照深浅也分深拷贝和浅拷贝。

一、数组和字符串拷贝

1、= 赋值

举例:

a1 = 123
a2 = 123
print(id(a1))
print(id(a2))

结果:(在你的电脑试验和这里的地址肯定不同)

140723824476816
140723824476816

原因是Python有一个重用机制,对于同一个数字,Python并不会开辟一块新的内存空间,而是维护同一块内存地址,a1,a2变量指向数字123的地址。等同于a2 = a1,使用字符串赋值也是同理。

结论:对于通过用 = 号赋值,数字和字符串在内存当中用的都是同一块地址。

2、浅拷贝

举例:

import copy  # 使用浅拷贝需要导入copy模块
a1 = 123
a3 = copy.copy(a1)  # 使用copy模块里的copy()函数就是浅拷贝
print(id(a1))
print(id(a3))

结果:(在你的电脑试验和这里的地址肯定不同)

140723824476816
140723824476816

发现地址还是一样。

结论:对于浅拷贝,数字和字符串在内存当中用的也是同一块地址,和上面讲的原理相同。

3、深拷贝

举例:

import copy
a1 = 123
a4 = copy.deepcopy(a1)  # 深拷贝是用copy模块里的deepcopy()函数
print(id(a1))
print(id(a4))

结果:(在你的电脑试验和这里的地址肯定不同)

140723824476816
140723824476816

发现地址还是一样。

结论:对于深拷贝,数字和字符串在内存当中用的也是同一块地址,和上面讲的原理相同。

综上所述,对于数字和字符串的赋值、浅拷贝、深拷贝在内存当中用的都是同一块地址。

在这里插入图片描述

二、字典,列表,元组等数据结构类型拷贝

1、=赋值

举例:

dict1 = {'k1': 'wu', 'k2': 123, 'k3': {1: 'alex', 2: 678}}
dict2 = dict1
print(id(dict1))
print(id(dict2))

结果:(在你的电脑试验和这里的地址肯定不同)

2331901131440
2331901131440

dict2变量只是指向了同一份字典数据的地址,如下图所示:

在这里插入图片描述

理解了上面的图我们看一下下面的代码:

dict1 = dict1['k3']
dict2 = dict1
dict2[3] = 'hiahia'
print(dict1)

我们逐步看怎么执行的:

dict1 = dict1['k3']

在这里插入图片描述

dict2 = dict1

在这里插入图片描述

dict2[3] = 'hiahia'

在这里插入图片描述

print(dict1)

所以结果是:

{1: 'alex', 2: 678, 3: 'hiahia'}
2. 浅拷贝

举例:

import copy
dict1 = {"k1": "wu", "k2": 123, "k3": {1: 'alex', 2: 678}}
dict3 = copy.copy(dict1)  # 浅拷贝
print("第一层字典的内存地址:")
print(id(dict1))
print(id(dict3))
print("第二层嵌套的列表的内存地址:")
print(id(dict1["k3"]))
print(id(dict3["k3"]))

结果:(在你的电脑试验和这里的地址肯定不同)

第一层字典的内存地址:
2331901131872
2331901132088
第二层嵌套的列表的内存地址:
2331901155272
2331901155272

结果发现字典第一层确实被拷贝了,变成了两个,但第二层还是共用相同的数据,如下图:

在这里插入图片描述

结论:所以对于浅拷贝,字典、列表、元组等类型,它们只拷贝第一层地址。

3、深拷贝

举例:

import copy
dict1 = {"k1": "wu", "k2": 123, "k3": {1: 'alex', 2: 678}}
dict4 = copy.deepcopy(dict1)  # 深拷贝
print("第一层字典的内存地址:")
print(id(dict1))
print(id(dict4))
print("第二层嵌套的列表的内存地址:")
print(id(dict1["k3"]))
print(id(dict4["k3"]))
print("第三层嵌套的列表的内存地址:")
print(id(dict1["k3"][1]))
print(id(dict4["k3"][1]))

结果:(在你的电脑试验和这里的地址肯定不同)

第一层字典的内存地址:
2331901131872
2331901132376
第二层嵌套的列表的内存地址:
2331901155272
2331901091976
第三层嵌套的列表的内存地址:
2331901150912
2331901150912

发现一二层被拷贝了,最底层的数字和字符串数据依然共用,如下图:

在这里插入图片描述

结论:对于深拷贝,字典、列表、元组等类型,它里面嵌套多少层,就会拷贝多少层出来,但是最底层的数字和字符串地址不变。

实施文档 流程管理 2008-04-23 09:44:00 874 收藏 3 分类专栏: 企业管理杂谈 文章标签: 文档 文档管理 项目管理 工作 配置管理 工具 项目实施文档是用来记录、描述、展示实施过程中一系列信息的处理过程,通过书面或图示的形式对项目活动过程或结果进行描述、定义、规定及报告。例如分阶段实施计划文档,标准业务流程文档,标准编码及数据文档,标准参数设置文档,功能操作指南文档。这些文档将会伴随着ERP实施的各个阶段逐渐充实、完善,也同时记载了整个实施的过程和成果。 作为实施顾问人员,在实施过程 阅读详情

相关推荐

别再乱调NvM_WriteBlock了!手把手教你搞懂Autosar NVM状态机与读写时序

本文深入解析Autosar NVM状态机与读写时序,帮助开发者避免常见错误。通过详细的状态机解读、最佳实践代码示例和异常处理策略,提升嵌入式系统中数据存储的可靠性。特别针对NvM_WriteBlock的调用逻辑和状态机机制进行实战讲解,解决工程师在实际开发中遇到的异步写入问题。

weixin_33701617的博客 344

python批量生成变量名,字典(dict)操作

在python中,变量名储存在一个dict中,dict的keys为变量名,value为值。 可以通过local(),输入全部的变量 names=local()#获取全部局部变量名 print(names.keys()) 输出结果 ['_dh', '__', '__builtin__', 'names', 'quit', '_i3', '_i2', '_i1', '__package__', 'e...

weixin_44134757的博客 5113

TOEIC托业词汇汇总(完整版)

1.appointment 约会,约定2.attendance 出席人数;出席3.cabinet 橱柜4.calendar 日历;月历;行事历5.clerk 办事员,书记6.directory 人名住址薄7.duplicte 复制;副本8.filing 归档9.in-tray 待处理文件盒10.monitor 检测;监视;追踪11.out-tray 已处理文件盒12.partition 分隔;分隔物(如墙壁等)13.postage 邮费。

weixin_39676449的博客 1万+

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

本文主要参考这篇博文。

芒果干的博客 634

纯JS实现SM3加密算法(兼容IE浏览器)

纯JS实现SM3加密,IE、谷歌、火狐等浏览器可以直接使用。

qianpou的博客 7352

保姆级教程:在Ubuntu 20.04上搞定PX4飞控与T265的视觉定位(附避坑指南)

本文提供在Ubuntu 20.04上配置PX4飞控与T265视觉定位系统的详细教程,涵盖驱动安装、ROS与MAVROS桥接、PX4参数调优及故障排查。通过实测验证的步骤和避坑指南,帮助开发者实现厘米级精度的视觉定位,特别适合室内无人机应用。

weixin_29038155的博客 248

简单介绍python 存储变量的几种方法

使用scikit-learn跑一个两年前的案例, 报错:cannot import name ‘joblib’ from ‘sklearn.externals’安装旧版本的scikit-learn pip install scikit-learn==0.20.3。删除当前版本的scikit-learn pip uninstall scikit-learn。解决方法一: 直接使用import joblib。# 将文件中的变量加载到当前工作区。# 将变量存储到目标文件中区。# 存储变量的文件的名字。

Free雅轩的博客 5767

一生一芯——用RTL实现最简单的处理器NPC(南大数逻计组RV32ICPU) 代码及思考参考

本文介绍自己前期用Verilog编写的基于RV32I指令集的CPU,个人认为是最简单最易懂的版本(即没做什么优化,即代码很水,没有考虑一些奇怪的情况,只适用简单指令序列,即题目所示最简单的处理器),适合新手练手Verilog以及了解简单CPU的运行过程。本文基于一生一芯,利用Verilator进行仿真,并用gtkwave查看波形,不了解verilator和gtkwave的可以看前几篇文章。

long0_o的博客 3308

python 如何保存字典变量

python 如何保存字典变量 from sklearn.externals import joblib x = {} x['gynuyncvf'] = ["sdsdfsdfsdf",[1,2,3,4]] x['gyndsfdsuyncvf'] = ["sdsdfsdfsdf",[1,2,3,4]] # 保存x joblib.dump(x, 'x.pkl') # 加载x x = joblib.load('x.pkl')

Kp0fS的草稿纸 1423

图像处理 | 基于matlab的多尺度Retinex(MSR)和自适应直方图均衡化(CLAHE)算法联合的低照度图像增强(附代码)

本文介绍了一种基于多尺度Retinex(MSR)和CLAHE的低照度图像增强算法。算法首先对图像进行多尺度Retinex处理,通过不同尺度的高斯核去除光照影响;然后采用CLAHE算法进行对比度增强。Matlab实现展示了算法流程,包含灰度转换、多尺度Retinex增强和CLAHE处理。实验结果显示,该方法能有效提升低照度图像的可见性,增强细节表现。最后提出了改进建议,包括引入深度学习方法和优化参数选择。

尘世冰封的专栏 952

FFMPEG音频开发: Linux下采集摄像头(使用V4L2框架)数据录制成MP4视频保存到本地

一、环境介绍 操作系统介绍:ubuntu 18.04 FFMPEG版本: 4.4.2 摄像头: USB摄像头、虚拟机挂载本机自带摄像头 二、FFMPEG与X264下载编译 X264下载地址: http://www.videolan.org/developers/x264.html FFMPEG下载地址:https://ffmpeg.org/download.html Yasm ...

8868

python的深浅拷贝和垃圾回收机制

python的深浅拷贝和垃圾回收机制 深浅拷贝 1. python的变量及其存储 python的一切变量都是对象,变量的存储,采用了引用语义的方式,存储的只是一个变量的值所在的内存地址,而不是这个变量的只本身 不管多么复杂的数据结构,浅拷贝都只会copy一层。 理解:两个人公用一张桌子,只要桌子不变,桌子上的菜发生了变化两个人是共同感受的。 2. 浅copy与deepcopy 浅copy: 不管多么复杂的数据结构,浅拷贝都只会copy一层 deepcopy : 深拷贝会完全复制原变量

weixin_47073925的博客 308

实战!C#整合YOLO+Halcon做玻璃瓶口缺陷检测:裂纹识别+尺寸测量一步到位(附DLL交互代码)

AI擅长语义识别(裂纹、缺陷),传统机器视觉擅长精密测量(尺寸、位置),C#做整合层,才能满足工业生产的“精度+效率+稳定性”要求。这套方案不只是玻璃瓶检测能用,改改模型和测量逻辑,还能用到瓶盖缺陷检测、饮料瓶液位检测等场景。如果你们厂也有类似的质检痛点,评论区留个言,我帮你看看怎么调整算法参数。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 868

深浅拷贝

什么是深浅拷贝 浅拷贝: 不管多么复杂的数据结构,浅拷贝都只会copy一层 深拷贝: 深拷贝会完全复制原变量相关的所有数据,在内存中生成一套完全一样的内容,我们对这两个变量中任意一个修改都不会影响其他变量 例: import copy a = [1,2,3,4,['a','b']] b = a c = copy.copy(a) d = copy.deepcopy(a) a.append(5) a[4].append('c') print(a) # [1, 2, 3, 4, ['a', 'b',

weixin_55205414的博客 173

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

python怎么输入根号3_python学习心得第三章

python学习心得第三章1.三元运算变量=值1 if 条件 else 值2由图如果条件成立则赋值1给变量,如果条件不成立则赋值2给变量.2.数据类型集合:set()class set(object):"""set() -> new empty set objectset(iterable) -> new set objectBuild an unordered collection ...

weixin_39747975的博客 3681

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

python基础篇--学习记录1.0

函数需要先定义,再调用定义函数会申请内存空间,将函数的子代码存进去,然后将这个内存地址绑定给函数名,所以说函数名指向的就是函数的内存地址.并且在定义阶段,不会执行函数的子代码,必须要调用函数才会执行.函数的定义阶段: 不会执行函数的子代码,但是会检测函数子代码的语法函数的调用阶段,调用其实背后做了两件事情1)通过函数名找到函数的内存地址,在函数的内存地址后面加上(),触发函数子代码的运行函数的定义阶段只会检测语法,不会执行代码func1是没有语法错误的,func2的语法也是没有错误的。

m0_68716275的博客 1308

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

python变量存储和深浅拷贝

python变量存储和深浅拷贝 python的变量及其存储 在高级语言中,变量是对内存及其地址的抽象。对于python而言,python的一切变量都是对象,变量的存储,采用了引用语义的方式,存储的只是一个变量的值所在的内存地址,而不是这个变量的值本身。 引用语义:在python中,变量保存的是对象(值)的引用,我们称为引用语义。采用这种方式...

weixin_30514745的博客 122

python深浅拷贝与赋值

  初学编程的小伙伴都会对于深浅拷贝的用法有些疑问,今天我们就结合python变量存储的特性从内存的角度来谈一谈赋值和深浅拷贝~~~ 预备知识一——python的变量及其存储   在详细的了解python中赋值、copy和deepcopy之前,我们还是要花一点时间来了解一下python内存中变量的存储情况。   在高级语言中,变量是对内存及其地址的抽象。对于python而言,python的一...

weixin_30815427的博客 127

Python | 赋值与深浅拷贝

被同学问到了Python深浅拷贝方面的问题,发现自己在这个地方还不太懂,便查找了资料,发现了一篇非常好的博客,转载在这里。 1.预备知识一:Python的变量及其存储 在详细的了解python中赋值、copy和deepcopy之前,我们还是要花一点时间来了解一下python内存中变量的存储情况。 在高级语言中,变量是对内存及其地址的抽象。对于python而言,python的一切变量都是对象,...

JYZ4MFC的藏宝库 344

python怎么设置颜色深浅变化_python——赋值与深浅拷贝

初学编程的小伙伴都会对于深浅拷贝的用法有些疑问,今天我们就结合python变量存储的特性从内存的角度来谈一谈赋值和深浅拷贝~~~预备知识一——python的变量及其存储在详细的了解python中赋值、copy和deepcopy之前,我们还是要花一点时间来了解一下python内存中变量的存储情况。在高级语言中,变量是对内存及其地址的抽象。对于python而言,python的一切变量都是对象,变量的存...

weixin_39789646的博客 377

python存储数据结构_Python数据结构之----数据存储与深浅拷贝

要深入的了解python的数据结构,就需要先了解一些Python中数据存储的知识,进而理解Python中深浅拷贝的原理,接下来我们进一步的来学习。一、Python的数据存储在高级语言(C、C++、Java、Python)中,变量是对内存及其地址的抽象。在Python里,一切变量都是对象,变量的存储采用了引用的方式,存储的只是一个变量值所在的内存地址,而不是变量的本身。即变量保存的是对应数据的地址,...

weixin_29131533的博客 243

python变量的存储原理详解

变量的存储 在高级语言中,变量是对内存及其地址的抽象。 对于python而言,python的一切变量都是对象,变量的存储,采用了引用语义的方式,存储的只是一个变量的值所在的内存地址,而不是这个变量的只本身。 引用语义:在python中,变量保存的是对象(值)的引用,我们称为引用语义。采用这种方式,变量所需的存储空间大小一致,因为变量只是保存了一个引用。也被称为对象语义和指针语义。 值语义:有些语言采用的不是这种方式,它们把变量的值直接保存在变量的存储区里,这种方式被我们称为值语义,例如C语言,采用这种存储方

qq_42890800的博客 3956

Python中变量在内存的存储与地址变化详解(深浅拷贝,值/引用传递、可变不可变数据类型)

学习Python首先我们要知道Python变量保存的是值引用 也可以说:变量是对内存及其地址的抽象 Python:一切变量都是对象 变量的存储,采用了引用语义的方式,存储的只是一个变量的值所在的内存地址,而不是这个变量的值本身 见下图 采用这种方式:变量所需的存储空间大小一致,因为变量只是保存了一个引用。也被称为对象语义和指针语义。变量的每一次初始化,都开辟了一个新的空间,将新内容的地址赋值给变...

Z小旋 2万+

python深浅拷贝

各基本数据类型的地址存储及改变情况 在python中的数据类型包括:bool、int、long、float、str、set、list、tuple、dict等等。我们可以大致将这些数据类型归类为简单数据类型和复杂的数据结构。 数据结构: 集合结构:set 序列结构: tuple list (str) 映射结构: dict 基本数据类型 Int long floa...

dbz84070的博客 68

python--赋值与深浅拷贝

参考:http://www.cnblogs.com/Eva-J/p/5534037.html#undefined 一、python的变量及其存储   在高级语言中,变量是对内存及其地址的抽象。对于python而言,python的一切变量都是对象,变量的存储,采用了引用语义的方式,存储的只是一个变量的值所在的内存地址,而不是这个变量的只本身。   引用语义与值语义详解 引用语义:在...

大发的博客 463

python存储大量数据的数据结构_Python数据结构之----数据存储与深浅拷贝

要深入的了解python的数据结构,就需要先了解一些Python中数据存储的知识,进而理解Python中深浅拷贝的原理,接下来我们进一步的来学习。一、Python的数据存储在高级语言(C、C++、Java、Python)中,变量是对内存及其地址的抽象。在Python里,一切变量都是对象,变量的存储采用了引用的方式,存储的只是一个变量值所在的内存地址,而不是变量的本身。即变量保存的是对应数据的地址,...

weixin_39698007的博客 292
上一篇: Python排序
下一篇: 学习LeNet(网络讲解+代码)
Guuuuuu老师儿
博客等级 码龄9年 259粉丝 718原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值