再谈Python的引用和变量

简介: 再谈Python的引用和变量

再谈Python的引用和变量

上一次我们介绍了一个有用的代码可视化工具Python Tutor,说到我们还要通过这个工具再探讨一下Python引用相关的话题。因此有了本文。


引用


观察代码框下方的布局,可以看到两个按钮之下还有三个下拉菜单,依次点击之后本酱发现了一个神奇的选项:render all objects on the heap (Python/Java)。即图中红框处下拉菜单的第三个选项:


image.png


这个选项什么意思呢?翻译一下就是“对于Python和Java两种语言,该工具可以渲染出堆上的所有对象”。


堆是什么意思暂时不用我们操心,只需要知道这么个东西也不影响我们进一步理解接下来的内容。简单地介绍一下,即程序运行过程中,所有的对象都会在堆上创建维护。


换言之这句话的潜在含义就是会将程序中的所有对象渲染出来。


好嘛,说来说去半天了,这个选项到底干嘛的呀?就不能给个痛快话吗?


在之前讨论引用的文章中我们提到过,“在Python中,一切皆对象”。但在之前的图示中有的东西好像不那么一样——整数好像是不可分割的。


使用下面的代码试试:

a = 1
b = a
c = 1


默认图示:


image.png


这好家伙,你还敢说什么“一切皆对象”?整数不就是一个高尚的,哦不,纯粹的数字吗?同样是直接赋值,变量ab之间并没有任何关系啊。


这就是这个工具的一点不足了——也说不上不足,实际上也是为用户考虑的结果——但是这样一来,不少粗心的用户,咳,其实是还没开始认真学英语的用户,就很容易忽视下面的选项,从而怀疑自己学到的东西都是个啥。


放一万个心,你学到的东西都没错,错的是这个世界(记得划掉)这个选项。


让我们把选项切换为“render all objects on the heap (Python/Java)”重新执行一次代码:


微信图片_20220213114503.gif


09


仿佛有什么奇怪的事情发生了……


那些指向数字“1”的箭头都是什么鬼啊啊啊啊?(怒吼)


这些都是引用啊~


实际上即使是数字,在Python也是以对象的形式存在的,拥有对应的值、对应的引用以及其他一些属性;只是我们很少称其为“整数对象”。


通常来说,像数字这样我们称之为“基本类型”的数据,既有其特殊的一面,在实际编程中也极为常用,为了避免图示过于混乱——毕竟各种箭头拉过来拉过去的,想不乱也不行啊——Python Tutor默认会将基本类型的数据内联于引用它的元素。


到这里,之前的误会也就解开了。并不是因为Python中的数字特殊到不属于对象的范畴,仅仅是因为我们使用的工具默默地对其进行了“优化”。这种优化说不上坏,但是在有的时候确实会对我们造成一定的困扰。


因此,这里本酱特地提醒各位读者老爷一句:在使用工具的时候千万小心,不要过分依赖任何工具。即使是你认为完美的工具,你也不知道它暗地里对你做了什么(优化)。


变量


终于讨论到了变量。


实际上刚看到陈老师的演示视频时,本酱第一时间想到的就是:这未免也太适合用来解释Python的变量了吧!


简直完美符合了本酱的预期,只恨晚生二十年,未能早一步将设想付之行动,blabla……(此处省略后悔词句,嘴炮一时爽)刚巧也印证了刚才本酱关于工具的提醒——好像成了一个鸡生蛋蛋生鸡的循环哈哈。


观察之前的任意一张示例图片,图示中的左侧均为变量帧Frame,也就是对于Python来说,变量本身之间并没有本质上的差异;并且我们早已知道,Python中虽然有不同类型的数据,但是就特定的变量而言,它可以随时随地改变指向为另一种类型的数据。


再进一步,实际上Python中的变量保存的一直都只是程序中各个对象的引用而已,只要规定好对象引用的大小规格,那么完全可以实现“同一个变量在不同的时期保存不同类型的数据”。


举个简单的列子


,比如Python中引用规定为8位二进制数,此时虽然引用0x01和引用0x02分别对应一个整数对象和一个列表对象,但是对保存8位二进制数的各个变量而言它们是没差的。谁管它到底是一个整数对象还是一个列表对象,就算是一个函数对象,那也和保存引用的变量没有关系。它孙行者造的孽,关我者行孙什么事哈哈。


现在各位读者老爷理解了吧?


在Python中,变量的地位十分之尴尬,变量本身并没有保存任何有效信息,并不像C等语言中变量本身即数据。Python中的变量,说得不好听一点儿,充其量就是一个个的标签,哪儿痛贴哪儿,啊呸,哪儿要贴哪儿,管你是人是鬼,先一发入魂。

大家跟我一起念:Python变量是标签,哪里需要哪里粘(zhan)。


总结

本文通过恰当地使用工具Python Tutor,以一种更加生动形象的方式展示了Python中变量和引用的本质。大家应该善用这样的一些工具来帮助自己学习理解一些看似艰深的概念。

参考资料

<十分钟!彻底弄懂Python深拷贝与浅拷贝机制>(微博@爱可可-爱生活)

Python Tutor主页

第17天:Python 之引用

目录
相关文章
|
12天前
|
Python
[oeasy]python050_如何删除变量_del_delete_variable
本文介绍了Python中如何删除变量,通过`del`关键字实现。首先回顾了变量的声明与赋值,说明变量在声明前是不存在的,通过声明赋予其生命和初始值。使用`locals()`函数可查看当前作用域内的所有本地变量。进一步探讨了变量的生命周期,包括自然死亡(程序结束时自动释放)和手动删除(使用`del`关键字)。最后指出,删除后的变量将无法在当前作用域中被访问,并提供了相关示例代码及图像辅助理解。
106 68
|
14天前
|
Shell Python
[oeasy]python049_[词根溯源]locals_现在都定义了哪些变量
本文介绍了Python中`locals()`函数的使用方法及其在调试中的作用。通过回顾变量赋值、连等赋值、解包赋值等内容,文章详细解释了如何利用`locals()`函数查看当前作用域内的本地变量,并探讨了变量声明前后以及导入模块对本地变量的影响。最后,文章还涉及了一些与“local”相关的英语词汇,如`locate`、`allocate`等,帮助读者更好地理解“本地”概念在编程及日常生活中的应用。
27 9
|
26天前
|
Python
Python三引号用法与变量详解
本文详细介绍了Python中三引号(`&quot;&quot;&quot;` 或 `&#39;&#39;&#39;`)的用法,包括其基本功能、如何在多行字符串中使用变量(如f-string、str.format()和%操作符),以及实际应用示例,帮助读者更好地理解和运用这一强大工具。
43 2
|
1月前
|
人工智能 Python
[oeasy]python039_for循环_循环遍历_循环变量
本文回顾了上一次的内容,介绍了小写和大写字母的序号范围,并通过 `range` 函数生成了 `for` 循环。重点讲解了 `range(start, stop)` 的使用方法,解释了为什么不会输出 `stop` 值,并通过示例展示了如何遍历小写和大写字母的序号。最后总结了 `range` 函数的结构和 `for` 循环的使用技巧。
35 4
|
2月前
|
Python
【10月更文挑战第5天】「Mac上学Python 8」基础篇2 - 变量深入详解
本篇将详细介绍Python中变量的使用方式和进阶操作,涵盖变量的输入与输出、变量的多重赋值、变量的内存地址管理以及变量的传递和交换等操作。通过本篇的学习,用户将对变量的使用有更深入的理解,并能灵活运用变量进行各种编程操作。
55 1
【10月更文挑战第5天】「Mac上学Python 8」基础篇2 - 变量深入详解
|
29天前
|
机器学习/深度学习 存储 数据挖掘
Python 编程入门:理解变量、数据类型和基本运算
【10月更文挑战第43天】在编程的海洋中,Python是一艘易于驾驭的小船。本文将带你启航,探索Python编程的基础:变量的声明与使用、丰富的数据类型以及如何通过基本运算符来操作它们。我们将从浅显易懂的例子出发,逐步深入到代码示例,确保即使是零基础的读者也能跟上步伐。准备好了吗?让我们开始吧!
26 0
|
3月前
|
机器学习/深度学习 算法 数据可视化
8种数值变量的特征工程技术:利用Sklearn、Numpy和Python将数值转化为预测模型的有效特征
特征工程是机器学习流程中的关键步骤,通过将原始数据转换为更具意义的特征,增强模型对数据关系的理解能力。本文重点介绍处理数值变量的高级特征工程技术,包括归一化、多项式特征、FunctionTransformer、KBinsDiscretizer、对数变换、PowerTransformer、QuantileTransformer和PCA,旨在提升模型性能。这些技术能够揭示数据中的潜在模式、优化变量表示,并应对数据分布和内在特性带来的挑战,从而提高模型的稳健性和泛化能力。每种技术都有其独特优势,适用于不同类型的数据和问题。通过实验和验证选择最适合的变换方法至关重要。
58 5
8种数值变量的特征工程技术:利用Sklearn、Numpy和Python将数值转化为预测模型的有效特征
|
2月前
|
存储 编译器 Python
Python--变量、输出与输入
【10月更文挑战第5天】
|
2月前
|
测试技术 Python
Python MagicMock: Mock 变量的强大工具
Python MagicMock: Mock 变量的强大工具
54 4
|
2月前
|
存储 Java 编译器
Python学习三:学习python的 变量命名规则,算数、比较、逻辑、赋值运算符,输入与输出。
这篇文章是关于Python编程语言中变量命名规则、基本数据类型、算数运算符、比较运算符、逻辑运算符、赋值运算符以及格式化输出与输入的详细教程。
24 0
Python学习三:学习python的 变量命名规则,算数、比较、逻辑、赋值运算符,输入与输出。
下一篇
DataWorks