python程序员的基本素养--你从没见过的Python变量引用

Python 引用 从懵懂到精通!!! 阅读详情

变量在我们的编程中是最基础的概念,它就相当于我们盖大楼用的砖块一样不可或缺。理解变量的运行方式至关重要。

九层之台,始于垒土;合抱之木,始于毫末;千里之行,始于足下!

今天就让我们一起来谈一谈Python变量的那些事。

1. 变量不是盒子

让我们看看下面的代码

a = "hello,world"
b = a
c = [1,2,3]

对于我们初学者来说,变量的赋值是最容易走进误区的地方。最常见的误区是什么呢?

定义一个变量,就在内存中创建一个变量盒子,然后把变量的值放在这个盒子中

让我们看看下面这张图,这种想法是大错特错的。就是因为这种误区,使得我们的代码可能遇到很多问题。

那正确的是什么?变量赋值的时候做了什么呢?

2. 千奇百怪的变量

a = "hello,world"
b = a
c = [1,2,3]

所以上面的代码究竟做了什么?在这之前,我先大家讲个故事。

上个世纪90年代的时候,我们大名鼎鼎的蟒蛇自助大酒楼开业了。顾名思义,这家酒楼主要是做自助餐的,但是呢?它每个顾客只能吃一种美食,并且会把美食分布在不同的房间里面,美食种类是不固定的,顾客有什么需求就提供什么。

这天,我们的小a同学来到了酒楼,跟前台说,我要吃“hello,world”,于是,酒店前台就新开了一间房间,房号为:00010,并且在里面放上了我们的“hello,world”,并且给了 a 一张通行证,这张通行证只能通往00010号房间。并且记录下 hello,world:食用人数:1 ,当a想吃的时候,就自己拿通行证去00010号房间去拿

过不久,小b也来到了我们的酒店,跟酒店前台说,我要跟a吃一样的东西。于是酒店前台,也给了b一张通行证,b根据通行证也能去到00010号房间去拿hello,world。酒店前台再次记录: hello,world:食用人数:2

紧接着,我们小c同学也来了,他跟b不一样,他有自己想吃的食物。他跟酒店前台说:我要吃[1,2,3]。顾客有了新的需求,酒店前台就又新开一件房间,房号为:00020,并且也在里面放上了[1,2,3]。同样给c一张通行证。然后记录下: [1,2,3]:食用人数:1

我们可以带着这个故事往下面看

根据这张图,我们上面的故事中:

  • 顾客a、b、c:变量a、b、c
  • 酒店:内存空间
  • 酒店前台:Python解释器
  • 房间:为对象划分的内存空间
  • 房间号:对象所在的内存地址
  • 食物:各种各样的对象(字符串、列表、字典、数字。。。)
  • 前台记录的食用人数:引用计数
  • 通信证号码:变量引用的内存地址

实际上当我们对一个变量赋值的时候,我们的变量并没有存储这个值。而是绑定了一个内存地址id,当我们要用这个变量的值的时候,就去内存中寻找这个地址的存储的值

接着上面的故事,我们的小a同学,吃腻了hello,world,现在想吃123456,于是跑去跟酒店前台说,我现在想吃123456了,酒店前台二话不说,新开了一间房间,房号为00030,里面放着123456,并且更新了a同学的通行证,此时这张通信证只能去00030号房吃123456。前台继续记录 hello,world:食用人数:1 、 123456:食用人数:1

在代码中,我们改变了a变量的值,会发生什么呢?

我们再看看,改变a的变量会发生什么?

a = 123456

会这样吗?

我们改变a的值的时候,并不会直接去改变a指向的内存地址存储的值,而是新开辟一个空间存放新的值123456,把a的指向改成新空间的地址00030,如下图所示。正确的应该是这样:

我们的b同学非常喜欢模仿,她现在又不想吃hello,world了。于是他就跑下楼去跟酒店前台说:我要吃[1,2,3]。注意哦,这次b同学说的是,我要吃[1,2,3],而不是说我要吃跟c一样的。虽然他们的食物是一样的。但是我们的前台并不会直接给b 00020号房间的通行证。而是新开一间房间,房间号00040,里面放[1,2,3],并且给b一张通行证指向00040号房间。同事记录上 (00040)[1,2,3]:食用人数:1 、 (00010)hello,world:食用人数:0

b = [1,2,3]

为什么呢?其实这里很好理解,因为我们b赋值的时候是新建了一个对象。只要新建对象,就会重新开辟空间。

但是,像这样

b = c

这样并没有新建对象,而是将c的引用传递给了b,他们都指向一个对象。这里小伙伴们留意一下,不要被我的例子给带跑偏了。

这个时候,我们的酒店前台发现00010号房间里面的hello,world已经没人吃了。这个时候酒店前台就会把这间房间收回来,并且把里面的hello,world食物丢掉。这个就是python的垃圾回收机制。

此时,又来了以为同学d,d跟酒店前台说,我要跟c吃一样的,酒店前台就给d发了一张通行证,d根据通行证能去到00020号房间去拿[1,2,3]。酒店前台再次记录: [1,2,3]:食用人数:2

d = c

但是我们的d同学非常挑剔,他不满足现有的[1,2,3],他想要加点菜,也是就跟前台说要加菜:这时候00020房间里面放的东西就变成了[1,2,3,4]

d.append(4)

此时,我们发现了一个问题,c同学什么也没有干,但是他能吃的食物从[1,2,3]变成了[1,2,3,4]

这究竟是什么问题呢?

为什么我们之前a从“hello,world”变成123456的时候,是新开辟一块空间。但是现在d从[1,2,3]变成[1,2,3,4],却直接在原内存空间里修改呢?

这就是python经典的面试题:对象的可变性?什么是可变对象,什么是不可变对象?

3. 可变对象与不可变对象

在python中,一切皆对象,但是这对象也分为两类:

  • 可变对象(3个):List(列表)、Dictionary(字典)、Set(集合)
  • 不可变对象(3个):Number(数字)、String(字符串)、Tuple(元组)

Python中看可变与不可变数据类型,主要是看变量所指向的内存地址处的值是否会改变 。

3.2 不可变对象

>>> a = 10000
>>> id(a)
139964684838128
>>> a = 30000  # 不可变对象,改变变量的值,实际上是实例化新对象、开辟新内存空间
>>> id(a)  # 产生了新的内存地址,说明已经不是原来的对象了
139964684837872
>>>

3.3 可变对象

>>> a = [1,2,3]
>>> b = a
>>> id(a)
139711046464264
>>> id(b)
139711046464264
>>> b.append(4)  # 可变对象,允许在原地改变对象的值
>>> id(b)
139711046464264  # 内存地址没有改变,说明是在原内存空间改变值
>>> id(a)
139711046464264
>>> b
[1, 2, 3, 4]
>>> a
[1, 2, 3, 4]

总结:

可变对象: 变量所指向的内存地址处的值是可以被改变的

不可变对象: 变量所指向的内存地址处的值是不可以被改变。

Python对象的引用及删除(2) 变量x引用新的对象6,这里并不影响y的引用,实际执行的是print(6,5)。变量由赋值语句创建的,而且是第一次给这个变量赋值时创建变量,创建对象的同时也建立了变量对对象的引用。变量有自己的存储空间,变量引用对象是该变量存储了对象的内存地址,而不是对变量是由赋值语句创建的,而且是在第一次给同一变量赋值时,则改变的是该变量的引用。因此,说明同一变量可以引用不同类型的对象,对象是有类型的,而变量是没有类型的。当变量共享引用时,如果修改了被引用的对象,意味着所有引用对象的变量获得的将是改变之后的对象的值。 阅读详情

相关推荐

svn co --depth和svn up --set-depth 只check out下一层文件 只更新指定文件 只更新下一层的用法

svn的工程可能很大 有时我们只需要部分文件即可 这里介绍几个命令 1.svn co(check out) --depth --depth=empty,files,immediates,infinity 假设某svn结构如下 svn://root/PRO/A_dir/a svn://root/PRO/B_dir/b svn://root/PRO/c_file svn co --depth=emptysvn://root/PRO 此时只会在本地check out出 PRO/的空目录。 sv.

cy413026的博客 1万+

python中变量的引用的理解及两种常见的应用场景 超详细 简单易懂

一 变量和数据 数据是保存在内存中的某一个位置的;变量是记录的保存数据的地址的; 并且在python中,变量和数据都是保存在内存中的,并且变量和数据时分开存储的。 二 引用 (1)引用的含义:变量记录的是数据在内存中的地址,并且这个动作就叫做引用 (2)如果已经修改变量的引用,变量不再是原先数据的引用,变成了对新数据的引用(就指向了新的数据的地址,该变量中记录着新的数据) (3)使用使用id()函数就可以查看变量中保存数据的地址 (4)在计算机中,内存的地址其实就是一个数字,用%d的形式进行输出 三 引用在

weixin_54907221的博客 1851

用运放和乘法器DIY忆阻模拟器:从理论到Multisim仿真实战

本文详细介绍了如何利用运放和乘法器DIY忆阻模拟器,从理论基础到Multisim仿真实战。通过解析忆阻器的数学模型,设计关键电路模块,并完成仿真验证,帮助电子爱好者低成本实现忆阻器功能。文章还提供了实际调试中的常见问题解决方案和进阶应用建议,适合神经形态计算和非易失性存储领域的研究者参考。

weixin_28718345的博客 417

python之python的引用

python之python的引用引用列表引用 引用 概念 引用是一种变量指向数据存储空间的现象。 内存地址是数据在物理内存中的存储位置。 引用地址是对象在内存中的描述性地址,该地址与内存地址有区别。 特征 相同数据在内存中仅占用一个存储空间,不同的变量使用相同的数据则指向相同的存储空间。 获取 # 语法 id(数据) id(变量名) # 举例 x=2 print(id(x)) print(id(2)) 地址存储的特殊性 使用固定内存地址存储数据的: ①-5到256的整数 ②True和False

David_house的博客 805

task5:在本地搭建大模型(ollama 和 LM studio 对比),接入 openclaw

关于大模型,大家千万不要想着在本地部署,根本不可行,没有那个财力。另外大模型迭代快,不可能每周都在下载大模型。再次,还是国外的模型好用,国内的模型真的在 deepresearch 上就有很大问题,你们懂的。所以本篇文章,还是聚焦在探索层面+实操,并不会实战。

这里是 AI 食用指南,持续分享有用的AI 实操和应用! 1968

NGSIM数据集字段解析:从车辆轨迹到交通行为分析

本文深度解析NGSIM数据集的核心字段及其在交通行为分析中的应用。详细解读了车辆时空定位、状态属性及交互关系等关键字段,并通过高速路“幽灵堵车”和城市路口左转行为两个实战案例,展示了如何利用该数据集进行微观交通行为建模与驾驶特征提取,为交通流研究和自动驾驶算法测试提供数据基础。

weixin_29172963的博客 147

python基础8 - 变量2

1. 变量的引用 变量 和 数据 都是保存在 内存 中的 在 Python 中 函数 的 参数传递 以及 返回值 都是靠 引用 传递的 1.1 引用的概念 在 Python 中 变量 和 数据 是分开存储的 数据 保存在内存中的一个位置 变量 中保存着数据在内存中的地址 变量 中 记录数据的地址,就叫做 引用 使用 id() 函数可以查看变量中保存数据所在的...

477

X书关键词协议搜索

【代码】X书关键词协议搜索。

Codeooo 博客 6377

程序员应具备的职业素养-个人观点

程序员的职业素养不仅仅是技术能力的体现,更是职业态度和价值观的综合反映。深厚的专业知识、持续学习的态度、解决问题的能力、创新精神、团队合作与沟通能力、高度的责任心和职业道德,都是一个优秀程序员应具备的职业素养。在实际工作中,程序员需要不断提升自己,时刻保持对职业素养的重视,才能在快速发展的科技领域中立于不败之地。

DG353138的博客 2176

YOLOv11改进策略【模型轻量化】| 替换骨干网络为 GhostNet V3 2024华为的重参数轻量化模型

一、本文介绍 本文记录的是基于 GhostNetV3 的 YOLOv11 轻量化改进方法研究。GhostNetV3的轻量模块采用重参数化方法,训练时为深度可分离卷积和1×1卷积添加线性并行分支,推理时通过逆重参数化移除分支、折叠操作,能够在不增加推理成本的同时提高性能,从而实现YOLOv11的轻量化改进。 专栏目录:YOLOv11改进目录一览 | 涉及卷积层、轻量化、注意力、损失函数、Backbone、SPPF、Neck、检测头等全方位改进 专栏地址:YOLOv11改进专栏——以发表论文的角度,快速

Limiiiing的博客 1845

读懂 ABAP CDS 注解的直接、继承与派生

本文系统梳理了ABAP CDS注解的评估逻辑,重点解析直接注解(Direct)、继承注解(Inherited)和派生注解(Derived)的差异及其在CL_DD_DDL_ANNOTATION_SERVICE中的处理方式。通过视图注解@Metadata.ignorePropagatedAnnotations可调控注解传播行为,避免下游语义影响上层视图。文章还提供了基于标准表的完整示例(包含底层视图、消费视图和ABAP报告程序),帮助开发者在实际系统中验证三层注解的叠加效果与阻断机制。关键点包括:派生注解的数据

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 245

【CS.SE】浅谈: 程序员的职业素养与成长之路

这篇文章探讨了程序员在职业生涯中应具备的职业素养,结合实际工作中的案例,展示了这些素养如何帮助程序员应对各种挑战并实现职业成长。文章重点介绍了持续学习、团队合作、责任心、适应变化、创新思维、自我管理、热情与持续动力、坚持与耐心以及追求卓越等方面的素养。同时,文章还提出了在职场中主动沟通和展示自己的建议,帮助程序员在职业生涯中获得更大的发展和晋升。通过这些分享,文章希望能够启发读者,共同努力,成为更优秀的程序员。

Charlie_Lee_CS的博客 1137

ruoyi-nbcio-plus基于vue3的flowable服务任务的升级修改

ruoyi-nbcio-plus基于vue3的flowable服务任务的升级修改

宁波阿成的博客 847

程序员六大职业素养

程序员六大职业素养 转自:http://vipnews.youkuaiyun.com/newscontent.aspx?pointid=2008_12_17_113115843  说起职业素养,可能大家脑子里马上反映出来的是西服领带公文包的精干白领形象,其实作为程序员来说,外在可能没有那么重要,更多的是内在职业素养,本期调查分享了两个研发小组的故事,让大家在统计数据的基础上进一步了解——什么是程序员需要的职业...

MatthewChen Piscesky 302

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

做为一个Python程序员的基本素养

今天在学习的过程中,明白了一些不是Python标准所必须要做的事情,二是做为一个合格的Python程序员应该所遵从的一些规范 分享给大家,有不足的地方请大家指正,此下是我学习的一点心得: 1.在给变量赋值的时候比如 name="zhangsan" 这样的代码看起来比较小气,二python程序员对于变量的命名赋值的时候一帮在变量名后面都会有个空格等于号的后面也会有一个空格例如: name...

weixin_30835923的博客 864

efm32 入门.pdf

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

程序员的职业素养(一)

一、专业与素养1. 专业人士的核心能力成为专业人士的核心包括:解决问题的方式(怎样分析问题、找哪些资料、怎样设计方案、方案利弊分析等等),步骤(怎样执行方案、怎样控制风险、怎样快速解决故障等等)以及反思(出现问题,如何避免同样错误再次发生)2. 职业素养那么,什么又是职业素养呢?不是天赋,也不是技艺高深,而是持续积淀的结晶。一方面它体现了能力和素质;另一方面,强调持续的积累和养成。拥有良好的职业素...

didi_cloud的博客 698

廖雪峰Python教程[完整版]

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

预科阶段1---程序员基本素养

一、程序员基本素养和职业规划 1.学编程不等于程序员 It’时代,编程是一种基本的技能。程序员是职业,it时代的核心建设者。 2.编程和说话一样,很简单 重点是逻辑思维,不是数学也不是英语 3.编程的应用范围 办公,科研,软件开发,安全 4.程序员的前途 人人皆可为程序员,程序员始终为高薪职业 5.职业发展 技术总监/cto 技术过硬,有管理能力 资深码...

时间静止 773

程序员重装的基本素养

在不可抗拒的因素下 手中的厚重游戏本终于重装了 (小声逼逼一下 我想换macbook 16寸还是没有着落呜呜) 下面就是一个入门级程序猿的环境 软件总结(包含日常使用的软件) 写这些也是为了自己换电脑好有保障 装机第一步 火绒 重装第一步先装火绒 防止一大些乱踢八早的的东西出来 烦人 360驱动大师 驱动第一步 开发软件环境 JETBRAINS家族(重度依赖者)口碑是真的赞 docker 基本的容器使用我还是懂一点的 还在学习 程序员开发者必备 Chrome浏览器 插件爱好者 .

small_dog_的博客 402

《程序员的自我修养与高效学习方法》课程笔记

目录课程简介选择篇素养篇视野篇感想 课程简介 名称:《程序员的自我修养与高效学习方法》 平台:慕课网(www.imooc.com) 主讲人:7七月–全栈工程师 篇章: 选择篇 素养篇(思辨) 视野篇(主流和未来) 笔记更新时间:2020.2.2 这是一次视频课程的笔记,推荐看一看选择篇和素养篇,回归本心,坚持编程。 关于语言学习选择,必定因人而异,因环境而异,可以以思辨的态度看待,但无需过多...

weixin_43297257的博客 1278

测试/开发程序员的职业素养,不想成为优秀的码农,那和咸鱼有什么区别?

测试/开发程序员的职业素养不想成为优秀程序员的码农,那和咸鱼有什么区别?李清照有句诗生当作人杰,死亦为鬼雄。也许我们不必、也可能永远都不会是最优秀的程序员,但我们至少可以成为一名职业的程序员。我们也想成为一名专业人士。作为一名“专业人士”,不仅仅是一种荣耀,它更多的意味着义务,正所谓欲戴王冠,必承其重。当项目中有某个“临时工”犯了错误,他大可不必承担责任,只需要摊摊手,说几句自我安慰的话;如果是“职业”人员,你必须为自己写的每一行代码负责,出了bug必须承担相应的责任。httpshttps。...

大佬云集技术答疑交流群:743262921(进群暗号:222) 364

程序员需要哪些基本能力?

真的,能胜任程序员这个行业的人,在基本素养这一块能秒杀80%的其他行业就业者,因为这个行业对个人能力的要求真的太高了。

2201_75362610的博客 646

《编程素养与编程风格的养成》

现在是2019年3月17日,开始学C语言7天,这几天不断地吸取着各位前辈们的经验,了解到了有关于编程素养的问题。 1.注释一定要准确,文明。 2.个人的编程风格一定要确定好,不能在一个程序里出现多种风格。听说不同的互联网公司会有不同的规章制度。 3. ...

Shroudy的博客 301

程序员的基础素养

相比之下,Python更适合快速开发与数据处理。作为一名技术领域深耕的程序猿,有深刻的认识理论与实际操作的不同,通过一般动手实践,把进行在代码世界里的改动与修补作为跳动的NPC,那撬动数据里的每一个字符,可以转成文字与视频。也许你会想到上面的公式,作为程序员来讲,代码能实现是基本要求,在模仿优秀的参考案例下去提出以下几个问题 “产品功能是什么” 、“产品的要求是什么”、“调试前后产品产品能否做到有效运行”,根据这些问题回顾所掌握的专业知识,不断的分析问题的要点找出核心方案是作为一名合格程序员的主要任务。

2203_75458298的博客 48

程序员经验之谈书籍推荐

程序员经验之谈书籍推荐编程相关1.代码整洁之道-程序员的职业素养 编程相关 1.代码整洁之道-程序员的职业素养 作者是敏捷开发先驱, 内容讲解了程序员工作除编程工作外, 还需做到的一些标准, 让自身更加专业的一些需要注意的事项和需要掌握的技巧. 包括且不仅限于, 对需求的把控(说不或说是的艺术).对项目进度的估算, 并能作出合理的工期的承诺, 以及对时间的管理, 压力下保持冷静, 不该接受不切实际的项目工期承诺, 在危机下依然要保持纪律, 坚持上述所说的一些必须做到的准则,把注意力放在老板和团队正在关注的焦

www.iqer.info 225
上一篇: 在会计研究中使用Python进行文本分析
下一篇: PyTorch,你是不是想用Julia?不,我们还想要Python的生态
Python_xiaowu
博客等级 码龄5年 3096粉丝 178原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值