再谈Python的引用和变量

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

引用

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

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

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

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

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

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

使用下面的代码试试:

a = 1
b = a
c = 1

默认图示:

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

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

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

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

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

那些指向数字“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主页

Python 之引用

再谈Python的引用和变量相关推荐

  1. python老是报参数未定义_浅谈Python程序的错误:变量未定义

    Python程序的错误种类 Python程序的错误分两种.一种是语法错误(syntax error).这种错误是语句的书写不符合Python语言的语法规定.第二种是逻辑错误(logic error). ...

  2. python未定义_浅谈Python程序的错误:变量未定义

    Python程序的错误种类 Python程序的错误分两种.一种是语法错误(syntax error).这种错误是语句的书写不符合Python语言的语法规定.第二种是逻辑错误(logic error). ...

  3. python变量标识符_简谈-Python的注释、变量类型、标识符及关键字

    在Python程序中,要想支持中文输出,则要在代码前面添加 标识符:开发人员在程序中自定义的一些符号和名称 标示符是自己定义的,如变量名 .函数名等 标识符的规则: 标示符由字目.下划线和数字组成,且 ...

  4. Python GIL 系列之再谈Python的GIL

    1. 之前写过一篇<通过实例认识Python的GIL>的文章,感觉有些意犹未尽 2. 这次对例子作了些扩展,进一步的分析GIL对Python程序的影响 2.1 先来看例子: [python ...

  5. 再谈Python启动器与Anaconda解释器的关联问题

    问题 是否可以通过Python启动器(py.exe)启动Anaconda安装的Python解释器? 分析 一. 启动Python解释器有三种方法: 根据指定Python解释器的路径执行.按照这种方法是 ...

  6. python定义私有变量的方法_浅谈Python中的私有变量

    私有变量表示方法 在变量前加上两个下划线的是私有变量.class Teacher(): def __init__(self,name,level): self.__name=name self.__l ...

  7. 再谈Python多线程--避免GIL对性能的影响

    在Python中使用多线程,如果你对GIL本身没有一定的了解:那么很有可能你只是写出了正确的多线程代码,而并没有达到多线程的目的,甚至截然相反的效果.下面介绍了Python中GIL的作用和局限性,并提 ...

  8. python私有变量什么意思_浅谈Python中的私有变量

    私有变量表示方法 在变量前加上两个下划线的是私有变量. class Teacher(): def __init__(self,name,level): self.__name=name self.__ ...

  9. python基础教程第三版怎么样-Python基础教程(第三版)(七)再谈抽象

    菜鸡的学习笔记. 7.1 对象魔法 多态:可对不同类型的对象执行相同的操作,但是操作将随对象所属的类型而异: 封装:对外隐藏对象内部工作原理的细节: 继承:可基于通用类创建出专用类. 按作者的意思,多 ...

最新文章

  1. 【数字信号处理】基本序列 ( 实指数序列 | 收敛序列 | 发散序列 )
  2. 3.3 matlab用switch语句实现选择结构
  3. C语言 | 编程实现1
  4. 经典C语言程序100例之十四
  5. Hello,PyQt5!
  6. Tomcat解决HTTP GET中文乱码
  7. STL源码剖析 map
  8. 对于IPV6必须知道的几点
  9. sas一元回归分析_商业分析的应用
  10. Spring的入门学习笔记 (注解)
  11. Spring MVC 起步
  12. document.all用法
  13. C#基础系列:实现自己的ORM(构造我自己的ORM)
  14. 举例说明计算机网络协议,第二章计算机网络协议与体系结构.ppt
  15. 安装python缺少dll_解决win7操作系统Python3.7.1安装后启动提示缺少.dll文件问题
  16. PCM音量控制(高级篇)
  17. 电气工程师证书如何考试拿证
  18. 妇科宫颈细胞学计算机检查,宫颈细胞学检查是怎么回事?
  19. 镁光闪存颗粒对照表_内存颗粒型号识别
  20. 基于对立非洲秃鹫优化算法求解单目标优化问题(OAVOA)含Matlab代码

热门文章

  1. Kali下面装goldendict词典的安装和添加词典文件
  2. 生鲜巨变:每日优鲜、叮咚买菜、盒马“分道扬镳”?
  3. 2022美赛C题 预测模型
  4. 面试系列(十六):58同城 后台开发
  5. 如何更改您的Apple Watch表带(不花一吨)
  6. com.google.zxing图片叠加,二维码生成,图片加文字
  7. 计算机管理中be启动不了,绝地求生BE服务启动不了怎么办 BE服务无法启动的解决方法...
  8. oracle无法删除em,Oracle 11g EM删除重建的方法
  9. 用 Gnuplot 绘制实验数据
  10. 认识C标准函数库全集-2-测试及定义类文件-assert/errno/ctype/float/limits/locale/stddef