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

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

在这里插入图片描述

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

PointMLP实战:5分钟用PyTorch搭建点云分类模型(附GitHub代码) 本文提供了基于ICLR 2022论文PointMLP的点云分类模型实战教程。通过PyTorch框架,详细介绍了从环境搭建、数据预处理、模型架构解析到训练推理的全流程,并分享了性能调优技巧。该模型利用残差MLP模块构建,结构清晰高效,适合开发者快速上手并应用于实际点云处理项目。 阅读详情

相关推荐

【2026-Spark实验一-Windows中安装Spark环境】

本文详细介绍了在Windows系统中配置Spark 3.5.8开发环境的完整流程。主要内容包括:安装JDK 8并配置环境变量,下载并解压Spark 3.5.8预编译版,设置SPARK_HOME系统变量,配置Hadoop的winutils工具解决Windows兼容性问题。通过spark-shell和SparkPi示例程序验证环境配置成功,确保Spark能够正常运行分布式计算任务。文中特别强调了路径命名规范、环境变量设置顺序等关键细节,提供了完整的配置截图和验证方法,帮助开发者快速搭建稳定的Spark学习环境。

pblh123的专栏 1586

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

科研党必备:用Python+Excel批量下载文献的保姆级教程(附常见错误解决)

本文提供了一套利用Python和Excel实现外文文献批量下载的自动化解决方案。教程详细介绍了如何从数据库导出并清洗DOI信息,编写健壮的Python脚本进行批量下载,并包含错误处理与进阶优化技巧,旨在帮助科研人员将重复性劳动自动化,大幅提升文献收集效率。

weixin_29050513的博客 305

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

本文主要参考这篇博文。

芒果干的博客 634

从零到一:基于Esp32与LVGL的ST7789屏幕驱动全流程实战

本文详细介绍了基于Esp32与LVGL的ST7789屏幕驱动全流程实战,包括环境准备、驱动文件改造、硬件接口配置、LVGL集成与优化等关键步骤。通过VSCode+ESP-IDF开发环境,读者可以快速掌握SPI模式下的屏幕驱动开发,解决常见问题如颜色错乱、画面撕裂等,并实现LVGL的高效集成与性能优化。

weixin_33725722的博客 711

时空数据建模的跨节点联邦图神经网络:KDD21 Cross-Node Federated Graph Neural Network for Spatio-Temporal Data Modeling

前言 联邦学习(FL)虽然已经被广泛研究,但是对复杂的时空依赖关系进行建模以提高预测能力仍然是一个开放的问题。此外目前最优的时空预测模型假定对数据的访问不受限制,忽略了对数据共享的限制。基于此,本文提了一个基于图联邦学习的时空数据模型 Cross-Node Federated Graph Neural Network (CNFGNN),该模型在跨节点联邦学习的约束下,使用基于图神经网络(GNN)的架构对底层图结构进行编码,属于结构化联邦的一种,每个本地模型利用私有数据进行学习,并保持分散性。CNFGNN

qq_56027260的博客 1810

简单介绍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

Altium Designer实战:手把手教你设计智能车竞赛疯狂电路组赛道(附封装库)

本文详细介绍了使用Altium Designer软件进行智能车竞赛“疯狂电路”组赛道设计的全流程实战指南。从理解比赛规则、搭建设计环境、创建专用元器件封装库,到电路布局、路径规划及设计输出验证,手把手教你高效完成符合计分标准的赛道图纸设计,并附上实用的封装库管理方法。

alice7model的博客 1320

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

2026年摩尔线程数字IC面试试卷带答案

本文摘要: 该试卷为数字IC设计笔试,满分120分,时长90分钟,包含单选题、波形分析题、多选题和代码设计题。重点考察时序约束(如set_false_path)、建立/保持时间、逻辑化简、复位机制、AXI协议、半导体工艺、状态机、GPU架构等核心知识点。多选题涉及异步FIFO设计、Verilog综合、亚稳态处理、C++关键字和低功耗技术。代码题要求实现单比特信号去毛刺电路,需稳定4个时钟周期才输出。试题解析详细,标注了企业面试高频考点,如摩尔线程自研的MUSA架构和花港GPU架构特点。整体内容专业性强,覆盖

Open 98

Android AVB 分析(十三)dm-verity 设备是如何映射的?

在上一篇《Android AVB 分析(十二)嵌入式设备安全中的 dm-verity 简介》介绍 dm-verity 原理的时候,作者提供了一个 dm-verity 演示的例子。本篇我们基于 AOSP 源码 `android-13.0.0_r41` 实际编译生成的 Google Pixel 7 (“panther”) 设备的 system 分区镜像进行 dm-verity 设备验证实战。

洛奇看世界 2438

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

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

weixin_47073925的博客 308

利用插件扩展 Qt 应用程序

不仅 Qt 本身可以通过插件进行扩展,而且 Qt 应用程序也可以通过插件来扩展,这需要应用程序使用 `QPluginLoader` 检测和加载插件。

青春不老,奋斗不止! 1万+

深浅拷贝

什么是深浅拷贝 浅拷贝: 不管多么复杂的数据结构,浅拷贝都只会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

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

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

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

python基础篇--学习记录1.0

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

m0_68716275的博客 1308

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

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、付费专栏及课程。

余额充值