本文字数:1355 字

阅读本文大概需要:4 分钟

00.写在之前

写这篇文章源自上次和一位读者的交流,在给他回答问题的时候我发现由于之前有学习 C 和 Java 这种静态编译类型语言的背景,使他在学习 Python 的时候还是会习惯用之前编程语言的思考去尝试理解 Python,导致他有时候会觉得很困惑,这个直接表现在他对于很多概念的理解很混乱。

比如在 Python 中使用变量的时候不需要提前声明变量及其类型,而且变量不会报错,这在之前学习静态语言的同学眼里是不可思议的,他们会有「这种情况下 Python 怎么知道变量是什么」等诸如此类的问题,这样的问题其实已经是进入了「动态类型」的领域了,Python 中类型是在程序运行过程中自动决定的。

因为我之前也是做 C 和 C++ 出身,初次接触 Python 的时候也会有这种不适感,所以我计划接下来更新一些文章,写一些像上面这样大家在转变上可能会困惑的地方,希望能给你带来一些帮助。

01.变量、对象和引用

像在上面说的,在 Python 中使用变量的时候不需要提前声明变量及其类型,变量还是会正常工作。在 Python 中,这个是以一种非常流畅的方式完成,下面以 a = 1 为例我们来看一下它到底是个什么情况。

首先是怎么知道创建了变量:对于变量 a,或者说是变量名 a,当程序第一次给它赋值的时候就创建了它,其实真实情况是 Python 在代码运行之前就先去检测变量名,我们不去具体深究这些,你只需要当作是「最开始的赋值创建了变量」。

再者是怎么知道变量是什么类型:其实这个很多人都没有搞清楚,「类型」这个概念不是存在于变量中,而是存在于对象中。变量本身就是通用的,它只是恰巧在某个时间点上引用了当时的特定对象而已。就比如说在表达式中,我们用的那个变量会立马被它当时所引用的特定对象所替代。

上面这个是动态语言明显区别于静态语言的地方,其实对于刚开始来说,如果你适应将「变量」和「对象」分开,动态类型你也就可以很容易理解了。

我们还是以 a = 1 为例,其实从上面的讲述中,我们很容易的可以发现对于 a = 1 这个赋值语句 Python 是如何去执行它的:创建一个代表值 1 的对象 --> 创建一个变量 a --> 将变量 a 和对象 1 连接。 下面我用一个图来更清晰的表示一下:

由上图我们可以看出,变量 a 其实变成了对象 1 的一个引用。如果你学过指针的话,你就会发现在内部「变量其实就是到对象内存空间的一个指针」。

同样还是上图,我们还可以看出在 Python 中「引用」是从变量到对象的连接,它就是一种关系,在内存中以指针的形式实现。

02.写在之后

所以总结一下,具体怎么来说明 Python 中的变量、对象和引用:

变量是到内存空间的一个指针,也就是拥有指向对象连接的空间;对象是一块内存,表示它们所代表的值;引用就是自动形成的从变量到对象的指针。

当然从技术的角度来讲对于上面的表述可能会存在一些问题,对象的结构绝不只是单纯的存值那么简单,但是对于刚入门来讲先这样理解就足够了,至于后续更深层次的探索等自己能力达到了可以尝试去接触。

当然对于这 3 个,内容不止于此,每一个展开来讲都能写很多,当然这些东西我也会在后面的文章中继续更新,慢慢的把它们补充完整,鉴于本人能力有限,如果有什么错误的地方,欢迎大家指正。

python中的引用怎么理解_浅谈动态类型领域中 Python 的变量、对象以及引用相关推荐

  1. python语法中infile语句_浅谈pymysql查询语句中带有in时传递参数的问题

    直接给出例子说明: cs = conn.cursor() img_ids = [1,2,3] sql = "select img_url from img_url_table where i ...

  2. python查询数据库带逗号_浅谈pymysql查询语句中带有in时传递参数的问题

    直接给出例子说明: cs = conn.cursor() img_ids = [1,2,3] sql = "select img_url from img_url_table where i ...

  3. java中修饰常量的事_浅谈java中的声明常量为什么要用static修饰

    今天定义一个类常量,想着也只有这个类可以用到,就没用static关键字修饰.结果sonar代码检查提示: Rename this field "PERSON_TYPE_USER" ...

  4. 动态磅是怎么原理_浅谈动态地磅的原理及未来发展方向

    浅谈动态地磅的原理及未来发展方向: 文章介绍了动态地磅的结构和工作原理,针对动态地磅的分类做了全面的概述,分别对不同的动态地磅做了对比及详细的阐述,说明选择和使用动态地磅器的注意事项,凸显了轴组式动态 ...

  5. 谈谈对python的理解_浅谈对python pandas中 inplace 参数的理解

    这篇文章主要介绍了对python pandas中 inplace 参数的理解,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 pandas 中 inplace 参数在很多函数中都会有, ...

  6. python的re2和re区别_浅谈Python中re.match()和re.search()的使用及区别

    1.re.match()fvk免费资源网 re.match()的概念是从头匹配一个符合规则的字符串,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None.fvk免费资源网 包含的参数如下: ...

  7. swift 引用其他类_浅谈swift中闭包修饰符 weak?unowned? 或什么都不用

    浅谈swift中闭包修饰符 weak?unowned? 或什么都不用 平常的开发中,clourse是我们iOSr绕不过去的坎儿. 苹果本身也很重视闭包,像之前的一些老的target-action类型的 ...

  8. python中for循环的用法_浅谈Python的for循环

    for循环在python中的重要性毋庸置疑,可是,我们真的把所有for循环的知识点都理解透了么?试试看以下内容: for 循环的基本格式 for iterable是可迭代对象,包括字符串,列表,元组, ...

  9. python 读excel字符型 数值_浅谈python 读excel数值为浮点型的问题

    浅谈python 读excel数值为浮点型的问题 如下所示: #读入no data = xlrd.open_workbook("no.xlsx") #打开excel table = ...

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

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

最新文章

  1. 趋势畅想-搭载android系统的智能数码相机
  2. 【C 语言】字符串操作 ( strlen 与 sizeof 函数 | 计算 字符串长度 与 内存块大小 )
  3. MySQL 高级 - 索引 - 索引语法
  4. python三大编程语言_程序员最需要的三种编程语言
  5. MYSQL IFNULL函数的使用
  6. c语言 long 用法,C语言中long long的用法
  7. cp命令显示进度条_教程 | Linux常用命令大全
  8. 网络工程师试题(二)2020-12-8
  9. pkuseg 和 jieba 分词对比测试,结果出乎意料...
  10. 计算机与单片机串口程序,51单片机与电脑串口通信,并用数码管显示的两种方法...
  11. 魔兽世界怀旧服务器无限刷怪点,魔兽世界怀旧服:4处无限刷新的打怪点!升级比血色站桩还快!...
  12. Parallels Desktop 16 Mac版怎么样?Parallels Desktop 16 For Mac评估
  13. 向 Dockerfile 传参 --build-arg 遇到的一些小坑
  14. react navigation 中使用goBack()跳转到指定页面
  15. 【数据可视化】数据之美---揭密优雅的数据解决方案背后的故事
  16. 细说;(function ($, undefined){ })(jQuery); 的使用
  17. 学习英特尔线程构建模块开源2.1库
  18. 【攻破html系列——第二天】网页结构
  19. 【Docker系列】Docker Swarm 多节点集群
  20. 用linux写跑马灯程序,Linux下LED跑马灯驱动

热门文章

  1. xcode 9.0 iOS 11
  2. 地址栏js的写法(转载)
  3. div+css需要注意的问题
  4. PHP生成HTML的技术原理
  5. Windows API一日一练(40)CreateRectRgn和CombineRgn函数
  6. 常见springboot依赖包关系
  7. postman工具 如何传递当前时间戳和MD5加密
  8. Springmvc源码分析之dispatcherServlet
  9. 设计模式 (十八 ) 观察者模式
  10. 多线程之Lock锁和读写锁ReadWriteLock