很多编程语言都有所谓的引用,对象,变量等概念。这些概念在强类型的语言中貌似并不是那么的重要,但是在动态类型的语言中,还是值得去仔细思考一下的

什么是变量

对于变量,在数学中我们已经了解过,就是一个值可能会改变的量。在C++中,我们对变量的认识应该相当于一个标识符,创建一个变量,即开辟一块内存然后给这块内存起个名字,那么这个名字就是“变量”,当然,这个变量的含义和内存地址以及指针都是不相同的。

那么在Python中,变量意味着什么呢?按照我的理解,一言蔽之,就是一个指针。这确实和之前学过的强类型语言是有不同的。为什么这么说呢?首先,python中的变量是没有类型的,有类型的是“对象”,而不是变量。变量没有类型,那么就意味着它可以随意指向任何对象。在强类型语言中,变量其实都是有具体的类型来限制的,规定一个类型的变量只能被赋值与该类型相同或兼容的值。但是在python中,显然变量的自由度更大。其次,之前学过体系结构的同学都应该了解,指针的内存空间大小是与类型无关的,其内存空间只是保存了所指向数据的内存地址。之所以说指针也有类型,是因为在计算偏移量的时候,确实需要类型相关的信息。所以,从深层次的含以上来理解,python中的变量与强类型语言中的指针非常相似。

In [1]: a = 3

In [2]: a = "abc"

In [3]: a

Out[3]: 'abc'

从上述代码中也可以明显的印证我们上面对python中变量行为的总结是正确的,与指针的行为非常相似。

什么是对象

我的理解是:对象=确定内存空间+存储在这块内存空间中的值。这一点其实和java有些相似。<>这本书前面第一章,就对对象和引用这两个概念做了很清晰的区分。Java中,对象是分配在堆上的,存储真正的数据,而引用是在堆栈中开辟的内存空间用于引用某一个对象。抛开java中引用的概念不谈,两种语言对于对象这个概念的理解,我认为还是可以等价的,都是数据+内存空间感觉。Python中,对象才有类型,不同的对象可以拥有不同类型的数据。

什么是引用

引用在Python中的语义应该是一种关系,即变量和对象之间的关系,其实也就是指针指向某一块内存空间的关系。既然是变量和对象之间的关系,那么其实就意味着,对于一个对象来说,和不同的变量可能存在着多个“引用”关系。因为变量是无类型的,他想关联谁就可以指向谁,这也就牵扯到了一个“引用计数”的概念,python中的gc大体上就是使用这种原理在做的。

既然说到多个变量可以引用同一个对象,那么就不得不说一下,如果其中一个引用改变了值,会影响到其他指向这个对象的变量么?

In [4]: a = 2

In [5]: b = a

In [6]: a

Out[6]: 2

In [7]: b

Out[7]: 2

In [8]: b =3

In [9]: a

Out[9]: 2

In [10]: b

Out[10]: 3

从上面的代码结果来看,答案应该是否定的。如果了解清楚变量和对象的语义就能对这个问题很容易做出判断,变量值的改变,就相当于指针变量内存空间内值的改变,也就是指向的对象换了一个,但其实之前所指向对象的内容是并没有收到影响的。

但是也有特例,比如列表,指向列表的变量通过索引访问的方式,可以直接改动列表在该索引处存储的值。这个时候,如果有两个变量同时引用一个列表对象,那么其中任何一个变量利用这种方式对列表的修改,都会影响到另外一个。

为了能够避免这种情况,可以对列表单独拷贝一份。两个变量互不干涉,而拷贝列表最直接的方式,莫过于“切片”操作了。

变量的比较

对于变量的比较,见得最多的,莫过于“==”和“is”。前者比较的是对象所存储的数据的值是否相等,后者则比较的是两个变量是否都引用了同一个对象。这些显而易见的东西,很多人应该不以为然,但是一些因语言内部优化的小细节,可能会打破你之前的认识。

In [12]: a = 3

In [13]: b = 3

In [14]: a == b

Out[14]: True

In [15]: a is b

Out[15]: True

按照我们之前所讲的,a和b两个变量应该是引用了两个不同的对象,但是这两个对象内存中的值都是3。但是,a is b得到的结果却是True。原因有如下两点:Python在底层做了一定的优化,对于使用过整数以及字符串都会被缓存起来。所以上述b引用的应该是被缓存过的3

之所以采用这种优化的方式,是因为python中数字和字符串一经创建都是不可修改的。所以不会出现,因使用了缓存的对象值造成“脏读”的问题

结尾

任何一种语言或是一种知识,表面上看起来都是有很多相似的地方的。这也是计算机相关知识的一个比较大的特点。但是很多东西,稍微的往底层走一点,其实还是差别很大的。接触了c++, golang, java, python这几种语言,仅仅是在对象,变量,引用这种最基本的概念上还是有挺多细节上的不同的,这也恰恰能够体现了每种编程语言的设计哲学。所以现在想想,多接触几门语言,并不是一件坏事。

python一个对象只能被一个变量引用吗_Python中的变量、对象、引用相关推荐

  1. python变量的作用_Python中的变量

    Python中的变量是用来表示一个值的标识符.变量代表了计算机内存中的一个地址.变量允许在程序中访问其他对象,调用函数或执行其他运算. 1.变量命名规则 变量是Python中的标识符,它应该遵循标识符 ...

  2. python一个对象只能被一个变量引用吗_python中的对象、变量、引用的问题

    对象.变量.引用 对象 对象包括 不可变对象 和 可变对象.但从某种意义上来说,可变和不可变并不是对立关系. int,string,float,tuple 这四类属于 不可变对象.这里不可变的含义是: ...

  3. python变量类型函数_python中的变量和数据类型

    一.变量定义:变量是计算机内存中的一块区域,存储规定范围内的值,值 可以改变,通俗的说变量就是给数据起个名字. 二.变量命名规则: 1. 变量名由字母.数字.下划线组成 2. 数字不能开头 3. 不可 ...

  4. python中给变量赋值时、既确定了变量的值_Python 中的变量赋值不需要类型声明,可以直接赋值,通过值来决定变量的类型。_学小易找答案...

    [单选题]"阴阳离决.精气乃绝"所反映的阴阳关系是 [单选题]在Photoshop通道种类中不包括( ). [单选题]国家垄断资本主义的主要形式是(). [判断题]Python 中 ...

  5. 哪个选项对python文件操作的描述是错误的_Python 中对变量描述错误的选项是

    [单选题]以下程序的输出结果是: for i in "Summer": if i == "m": break print(i) [单选题]下面代码的输出结果是: ...

  6. python中变量怎么定义_python中的变量的使用定义以及使用规则

    本篇包括14章内容,系统介绍了Python语言的基础知识.内容包括Python基础语法.数据类型和类型转换.运算符.流程控制(分支结构循环结构).数据结构(列表生成式).函数的定义及使用.异常处理.迭 ...

  7. python中的变量的作用_Python中的变量作用域

    python中变量作用域包括: L (Local) 局部作用域,函数内部声明但没有使用global的变量 E (Enclosing) 闭包函数外的函数中,def或者lambda的本地作用域 G (Gl ...

  8. python列表获取最后一个元素的方法_Python中如何获取 list/OrderedDict 的 第一个/最后一个 元素...

    本文最后更新于2016年5月14日,已超过 1 年没有更新,如果文章内容失效,还请反馈给我,谢谢! =Start= 缘由: 最近在工作中有接触到用Python的xmltodict模块进行XML的解析, ...

  9. python私有变量和继承_python中私有变量的继承

    在python中继承时,私有变量出现以下错误:AttributeError: 'dog' object has no attribute '_dog__name' 我找了很多东西,但不知道我的问题在哪 ...

最新文章

  1. python学习点滴记录-Day10-线程
  2. 【Java6】Date类/Calendar类,System类/Math类,包装类,集合,泛型,内部类
  3. Sqlserver 数据库安全
  4. 细说 Form (表单)(转)
  5. SLAM 无人车融合 IMU 前与 融合 IMU 后的实测效果演示
  6. 大数据-概念-应用-弊端
  7. jsp action java_jsp中Action使用session方法实例分析
  8. 利用有序队列寻找最大的K个数
  9. 第二季-专题2-我从内部看ARM
  10. 教你使用jmeter实现接口性能测试
  11. Thinkpad部分机型支持的智能感知功能介绍
  12. 8.2 使用Alpha混合技术
  13. 【寻找最佳小程序】12期:小程序数据助手——微信官方打造,移动端数据分析工具...
  14. Unity Cull 背面剔除
  15. 融云 java_融云开发者文档
  16. 初学larval 第二篇(大神绕道哦,针对新手友好的一篇)
  17. Hadoop系列之二:大数据、大数据处理模型及MapReduce
  18. 守望先锋:射线命中位置,相距距离,根据射线命中位置和相距距离找到对应实体在数组中的值
  19. “知识共享”与智能数学老师
  20. IDEA JAVA文档注释和方法注释模板

热门文章

  1. 中国自主可免费使用的一站式 IoT 集成开发环境 RT-Thread Studio 发布!
  2. 为什么 PUSH 推送要经常背锅?
  3. 达摩院实现自动驾驶核心技术突破,首次实现3D物体检测精度与速度的兼得
  4. 基础Git操作与GitHub协作吐血整理,收好!| 原力计划
  5. Python 爬取 20 万条评论,告诉你周杰伦新歌为啥弄崩 QQ 音乐?
  6. 17大主链均狂跌国内项目却看涨, 本周不可不知的7组榜单 | 数据周榜
  7. 苹果召回6.3万台MacBook Pro;罗永浩回应“收购苹果”;新版Edge支持Windows 7/8 | 极客头条...
  8. 喜大普奔,VS Code 开启远程开发新时代!
  9. 永远不要低估“价值互联网”!| 技术头条
  10. JavaScript 中的垃圾回收和内存泄露如何处理?| 技术头条