引用和对象分离

从最开始的变量开始思考:

在python中,如果要使用一个变量,不需要提前进行声明,只需要在用的时候,给这个变量赋值即可 (这个和C语言等静态类型语言不同,和python为动态类型有关)。

举第一个栗子:

a = 1

这是一个简单的赋值语句,整数 1 为一个对象,a 是一个引用,利用赋值语句,引用a指向了对象1;这边形象比喻一下:这个过程就相当于“放风筝”,变量a就是你手里面的“线”,python就跟那根“线”一样,通过引用来接触和拴住天空中的风筝——对象。

你可以通过python的内置函数 id() 来查看对象的身份(identity),这个所谓的身份其实就是 对象 的内存地址:

注:

python一切皆对象的理念,所以函数也是一个对象,因此可以使用 id() 函数的__doc__方法来查看这个函数的具体描述:

>>> id.__doc__"id(object) -> integer\n\nReturn the identity of an object. This is guaranteed to be unique among\nsimultaneously existing objects.       (Hint: it's the object's memory address.)"

第二个栗子:

a = 2a = 'banana'

利用上面第一个栗子用到的 id()函数:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> a = 1
>>> id(a)
24834392
>>> a = 'banana'
>>> id(a)
139990659655312

第一个语句中, 2是储存在内存中的一个整数对象,通过赋值 引用a 指向了 对象 1

第二个语句中,内存中建立了一个字符串对象‘banana’,通过赋值 将 引用a 指向了 ‘banana’,同时,对象1不在有引用指向它,它会被python的内存处理机制给当我垃圾回收,释放内存。

第三个栗子:

a = 3b = 3

通过函数查看 变量a 和 变量b的引用情况:

>>> a = 3
>>> b = 3
>>> id(a)
10289448
>>> id(b)
10289448

在这里可以看到 这俩个引用 指向了同一个 对象,这是为什么呢? 这个跟python的内存机制有关系,因为对于语言来说,频繁的进行对象的销毁和建立,特别浪费性能。所以在Python中,整数和短小的字符,Python都会缓存这些对象,以便重复使用。

第四个栗子:

1.  a = 42.  b = a(这里就是让引用b指向引用a指向的那个对象)3.  a = a + 2

通过函数查看引用情况:

当执行到第2步的时候,查看一下 a 和 b 的引用:

>>> a = 4
>>> b = a
>>> id(a)
36151568
>>> id(b)
36151568

可以看到 a 和 b 都指向了 整数对象 4

接下来指向第3步:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> a = a+2
>>> id(a)
36151520
>>> id(b)
36151568

可以看到 a 的引用改变了,但是 b 的引用未发生改变;a,b指向不同的对象; 第3句对 a 进行了重新赋值,让它指向了新的 对象6;即使是多个引用指向同一个对象,如果一个引用值发生变化,那么实际上是让这个引用指向一个新的引用,并不影响其他的引用的指向。从效果上看,就是各个引用各自独立,互不影响。

第五个栗子(这个栗子会涉及到 python中的 可变数据类型 和 不可变数据类型):

开始这个栗子之前,请记得注意到 第四个栗子的不同之处。

1.   L1 = [1, 2, 3]2.   L2 = L13.   L1[0] = 10

通过函数查看引用情况:

当执行第1步 和 第二步 的时候,查看一下 L1 和 L2 的引用情况:

>>> L1 = [1,2,3]
>>> L2 = L1
>>> id(L1)
139643051219496
>>> id(L2)
139643051219496

此时 L1 和 L2 的引用相同,都是指向 [1,2,3]这个列表对象。

接下来,继续执行第3步:

>>> L1[0] = 10
>>> id(L1)
139643051219496
>>> id(L2)
139643051219496
>>> L2
[10, 2, 3]

同样的跟第四个栗子那样,修改了其中一个对象的值,但是可以发现 结果 并不与 第四个栗子那样, 在本次实验中,L1 和 L2 的引用没有发生任何变化,但是 列表对象[1,2,3] 的值 变成了 [10,2,3](列表对象改变了)

在该情况下,我们不再对L1这一引用赋值,而是对L1所指向的表的元素赋值。结果是,L2也同时发生变化。

原因何在呢?因为L1,L2的指向没有发生变化,依然指向那个表。表实际上是包含了多个引用的对象(每个引用是一个元素,比如L1[0],L1[1]…, 每个引用指向一个对象,比如1,2,3), 。而L1[0] = 10这一赋值操作,并不是改变L1的指向,而是对L1[0], 也就是表对象的一部份(一个元素),进行操作,所以所有指向该对象的引用都受到影响。

(与之形成对比的是,我们之前的赋值操作都没有对对象自身发生作用,只是改变引用指向。)

列表可以通过引用其元素,改变对象自身(in-place change)。这种对象类型,称为可变数据对象(mutable object),词典也是这样的数据类型。

而像之前的数字和字符串,不能改变对象本身,只能改变引用的指向,称为不可变数据对象(immutable object)。

我们之前学的元组(tuple),尽管可以调用引用元素,但不可以赋值,因此不能改变对象自身,所以也算是immutable object.

is关键字:

当然,我们也可以要想知道是否指向同一个对象,我们可以使用 python的 is 关键词,is用于判断两个引用所指的对象是否相同。

就像上述第四个栗子 当进行到 第1步 和 第2步 的时候:

>>> a = 4  ……id(a) = 36151568
>>> b =a   ……id(b) = 36151568
>>> a is b
True

当进行到第3步的时候:

>>> a = a + 2  ……id(a) = 36151520
>>> a is b  ……id(b) = 36151568
False

突然想到,对于python 的 深拷贝 和 浅拷贝 的理解,也是可以根据这个进行验证,可以通过第五个栗子进行辅助理解。

python 引用和对象理解相关推荐

  1. python中对象的特性_python中类与对象之继承,python类和对象理解,面对对象的三大特性之...

    python中类与对象之继承,python类和对象理解,面对对象的三大特性之 面对对象的三大特性之继承 1.什么是继承? 在程序中,继承指的是class与class之间的关系 继承是一种关系,必须存在 ...

  2. python中的引用怎么理解_python 引用和对象理解

    今天浏览博客的时候看到这么一句话: python中变量名和对象是分离的:最开始的时候是看到这句话的时候没有反应过来.决定具体搞清楚一下python中变量与对象之间的细节.(其实我感觉应该说 引用和对象 ...

  3. python参数传递:对象的引用

    python参数传递:对象的引用 大家都知道在python中,一切皆对象,变量也不再具有类型,变量仅仅是对象的一个引用,我们通常用变量来测类型,通常测得就是被这个变量引用得对象的类型. 例如: 这里的 ...

  4. python一切皆对象的理解_Python中万物皆对象?的理解

    在很多地方都看到有过这样一句话,但是对象这个词的理解依然停留在谈朋友那个对象上-- python中一切皆为对象,一个对象的特征也称为属性(attribute).它所具有的行为也称为方法(method) ...

  5. python中的is判断引用的对象是否一致,==判断值是否相等

    python中的is判断引用的对象是否一致,==判断值是否相等 a = 10 b = 20 list = [1,2,3,4,5] print(a in list) print(b not in lis ...

  6. 深拷贝与浅拷贝、值语义与引用语义对象语义 ——以C++和Python为例

    深拷贝与浅拷贝.值语义与引用语义/对象语义 --以C++和Python为例 值语义与引用语义(对象语义) 本小节参考自:https://www.cnblogs.com/Solstice/archive ...

  7. python class用法理解_Python小世界:彻底搞懂Python一切皆对象!

    犹记得当初学习Python的时候,对于 Python一切皆对象 很是懵逼,因为Python是面向对象的动态型语言,而在函数及高阶函数的应用中,如若对于一切皆对象不是有很透彻的了解,基础不是那么牢固的话 ...

  8. 通过链表深入理解Java的引用和对象

    在正式介绍重点内容以前,先给像我这样的初学者强调一下 " = " 在引用和对象应用中的作用: 大致是 " = " 左边是引用," = " 右 ...

  9. python 类和对象 有必要学吗_Python学习——对类和对象的初步理解,初识,与

    大家好,今天跟大家简答介绍一下类的基础知识,主要有: Python中类和对象的概念 Python中的函数和普通函数的对比 python类语法的初识 一.Python中类和对象的概念 我们把一类相同的事 ...

最新文章

  1. [C] 图的深度优先遍历
  2. 如何接入虹软免费人脸识别SDK
  3. github 搜索_Fzf:Golang开发的Github高星系统模糊搜索补全工具
  4. 操作系统和常用软件下载
  5. 数据分析实例:企业需要什么样的数据分析人才?
  6. C#二进制流的序列化和反序列化操作
  7. MFC消息映射及消息处理函数原型
  8. Java程序员面试简历模板
  9. 万特电能表接线仿真系统 软件_电工技能——分享一款超实用的电工仿真教学接线Flash动画软件...
  10. 终于!疫情之下,第一批企业没能熬住面临倒闭,员工被遣散,没能等来春暖花开!
  11. 手机上计算机怎么设置,电脑如何设置wifi让手机上网
  12. word中插入常用几种公式编辑器
  13. 20170916_Linux下线程池技术
  14. 程序猿和测试媛——组合在一起的原因
  15. input正则邮箱_常用正则表达式—邮箱(Email)
  16. linux 查看dns进程,探查Linux系统DNS服务器运行状况
  17. 机器学习_决策树与信息熵
  18. 如何写好日记?让写日记工具助你写出精彩
  19. input文本框输入与输出(简单举例)
  20. 为什么鸿蒙系统那么火七星彩,七星彩要想独中500万 我们告诉你会出哪些号码!...

热门文章

  1. 【Unity】2.11 了解游戏有哪些分类对你开阔思路有好处
  2. [摘录]高效人士七习惯—从依赖到独立
  3. 名词解释_名词解释的答题技巧
  4. 【FI模块学习笔记】 实收资本概述
  5. PHP 5.6.30连接SAP GUI 730 配置(SAPRFC)
  6. BU_DATE_CHAR abap screen 日期字段搜索帮助
  7. 定义进项税代码缺省值
  8. 与NWBC相关的服务器端配置
  9. 一样是做鸭,绝味与周黑鸭的利润为何相差那么大?
  10. SAP配置webdynpro完全手册 .