零基础学python-6.2 共享引用

这一章节说说共享引用

我们先举一个例子

a=1
b=a

上面的例子就是共享引用,这里我们说说整个过程:

1.创建一个对象1

2.创建一个变量a

3.把a和1所在的内存空间连接起来,就是a引用1

4.a正在使用,创建变量b

5.a这个时候被对象1替代

6.b引用对象1

我们下面举另外两个例子:

>>> a=1.1
>>> b=1.1
>>> a is b
False
>>> a=1.1
>>> b=a
>>> a is b
True
>>> 

从例子中可以看见,最上面的a和b,两者直接分别指向不同的对象,下面的a和b,指向的是同一个对象, 这就是共享引用,这是一种内部的优化。

我们再来举一些例子,大家可以思考一下

a=1
b=a
a='2'

这个时候会怎样?

其实这个时候是这样的,b=1,a=‘2‘

再来,

a=1
b=a
a=a+1

这个时候又会是怎样?

由于我们之前已经说过,整数类型对象是不可变,所以,最后的结果是a=2,b=1,2这个对象是重新创建出来,然后赋值给a,所以不会出现a变b也变的情况

上面我们都是引用一些不可变的对象类型,我们下面引用一些可变的看看怎样?

>>> a=[1,2,4]
>>> b=a
>>> b is a
True
>>> a=24
>>> b is a
False
>>> a
24
>>> b
[1, 2, 4]
>>> 

如果我们从可变的换成不可变的,基本变化不会出现,但是,如果我们知识改动其中一个值,结果会是怎样?

>>> a=[1,2,4]
>>> b=a
>>> b is a
True
>>> a[0]=5
>>> b is a
True
>>> a
[5, 2, 4]
>>> b
[5, 2, 4]
>>> 

我们从代码里面看到,尽管我们改变了里面的值,但是两个变量间的关系没有改变,而且b随着a的改变而改变

如果不想出现这种情况,我们可以使用copy这个函数,或者使用分片

>>> a=[1,2,4]
>>> b=a[:]
>>> b is a
False
>>> a
[1, 2, 4]
>>> b
[1, 2, 4]
>>> 

通过上面的代码可以看见,a和b其实是引用两个不同的对象,只不过他们的值相同

分片一般是用在元组,如果是列表或者字典,则必须使用copy

如果对象里面还有可变对象类型,那么需要使用deepcopy这个函数,不然还是会出现a变b变的情况

还是上面的代码,我们在最后加一句

>>> a=[1,2,4]
>>> b=a[:]
>>> b is a
False
>>> a
[1, 2, 4]
>>> b
[1, 2, 4]
>>> a==b
True
>>> 

尽管a和b 的引用不同,但是如果我们使用==来对比两者,返回的结果是True,is是对比两者的引用,==对比两者的值

就说到这里,谢谢大家

------------------------------------------------------------------

点击跳转零基础学python-目录

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 20:16:30

零基础学python-6.2 共享引用的相关文章

[零基础学python]啰嗦的除法

除法啰嗦的,不仅是python. 整数除以整数 看官请在启动idle之后,练习下面的运算: >>> 2/5 0 >>> 2.0/5 0.4 >>> 2/5.0 0.4 >>> 2.0/5.0 0.4 看到没有?麻烦出来了,如果从小学数学知识除法,以上四个运算结果都应该是0.4.但我们看到的后三个符合,第一个居然结果是0.why? 因为,在python里面有一个规定,像2/5中的除法这样,是要取整.2除以5,商是0(整数),余数是5(整

[零基础学python]为什么要开设本栏目

这个栏目的名称叫做"零基础学Python". 现在网上已经有不少学习python的课程,其中也不乏精品.按理说,不缺少我这个基础类型的课程了.但是,我注意到一个问题,不管是课程还是出版的书,大多数是面向已经有一定编程经验的人写的或者讲的,也就是对这些朋友来讲,python已经不是他们的第一门高级编程语言.据我所知,目前国内很多大学都是将C之类的做为学生的第一门语言. 然而,在我看来,python是非常适合做为学习高级语言编程的第一门语言的.有一本书,名字叫<与孩子一起学编程>

[零基础学python]玩转字符串(1)

如果对自然语言分类,有很多中分法,比如英语.法语.汉语等,这种分法是最常见的.在语言学里面,也有对语言的分类方法,比如什么什么语系之类的.我这里提出一种分法,这种分法尚未得到广大人民群众和研究者的广泛认同,但是,我相信那句"真理是掌握在少数人的手里",至少在这里可以用来给自己壮壮胆. 我的分法:一种是语言中的两个元素(比如两个字)和在一起,出来一个新的元素(比如新的字):另外一种是两个元素和在一起,知识两个元素并列.比如"好"和"人",两个元素和

[零基础学python]玩转字符串(2)

上一章中已经讲到连接两个字符串的一种方法.复习一下: >>> a= 'py' >>> b= 'thon' >>> a+b 'python' 既然这是一种方法,言外之意,还有另外一种方法. 连接字符串的方法2 在说方法2之前,先说明一下什么是占位符,此前在讲解变量(参数)的时候,提到了占位符,这里对占位符做一个比较严格的定义: 来自百度百科的定义: 顾名思义,占位符就是先占住一个固定的位置,等着你再往里面添加内容的符号. 根据这个定义,在python里面

[零基础学python]一些关于Python的事情

如同学习任何一种自然语言比如英语.或者其它编程语言比如汇编(这个我喜欢,可惜多年之后,已经好久没有用过了)一样,总要说一说有关这种语言的事情,有的可能就是八卦,越八卦的越容易传播.当然,以下的所有说法中,难免充满了自恋,因为你看不到说Python的坏话.这也好理解,如果要挑缺点是比较容易的事情,但是找优点,不管是对人还是对其它事务,都是困难的.这也许是人的劣根之所在吧,喜欢挑别人的刺儿,从而彰显自己在那方面高于对方.特别是在我们这个麻将文化充斥的神奇地方,更多了. 废话少说点(已经不少了),进入

[零基础学python]集成开发环境(IDE)

当安装好python之后,其实就已经可以进行开发了.下面我们开始写第一行python代码. 值得纪念的时刻:Hello world 如果是用windows,请打开CMD,并执行python. 如果是UNIX类的,就运行shell,并执行python. 都会出现如下内容: Python 2.7.6 (default, Nov 13 2013, 19:24:16) [GCC 4.6.3] on linux2 Type "help", "copyright", "

[零基础学python]python中的四则运算

一提到计算机,当然现在更多人把她叫做电脑,这两个词都是指computer.不管什么,只要提到她,普遍都会想到她能够比较快地做加减乘除,甚至乘方开方等.乃至于,有的人在口语中区分不开计算机和计算器. 那么,做为零基础学习这,也就从计算小学数学题目开始吧.因为从这里开始,数学的基础知识列为肯定过关了. 复习 还是先来重温一下伟大时刻,打印hello world. 打开电脑,让python idle运行起来,然后输入: >>> print 'Hello, World' Hello, World

[零基础学python]开始真正编程

通过对四则运算的学习,已经初步接触了Python中内容,如果看官是零基础的学习者,可能有点迷惑了.难道在IDE里面敲几个命令,然后看到结果,就算编程了?这也不是那些能够自动运行的程序呀? 的确.到目前位置,还不能算编程,只能算会用一些指令(或者叫做命令)来做点简单的工作.并且看官所在的那个IDE界面,也是输入指令用的. 列位稍安勿躁,下面我们就学习如何编写一个真正的程序.工具还是那个IDLE,但是,请大家谨记,对于一个真正的程序来讲,用什么工具是无所谓的,只要能够把指令写进去,比如用记事本也可以

零基础学python》(第二版)

---恢复内容开始--- 零基础学python>(第二版) python学习手册 可以离线下载,  .chn格式, 插入小幽默笑话,在学习累的时候看看笑话 放松一下 欢迎下载转载,请注明出处,谢谢 下载地址          http://files.cnblogs.com/files/xuchunlin/%E3%80%8A%E9%9B%B6%E5%9F%BA%E7%A1%80%E5%AD%A6python%E3%80%8B%EF%BC%88%E7%AC%AC%E4%BA%8C%E7%89%88

[零基础学python]初识永远强大的函数

函数,对于人类来讲,能够发展到这个数学思维层次,是一个飞跃.可以说,它的提出,直接加快了现代科技和社会的发展,不论是现代的任何科技门类,乃至于经济学.政治学.社会学等,都已经普遍使用函数. 下面一段来自维基百科(在本教程中,大量的定义来自维基百科,因为它真的很百科):函数词条 [函数这个数学名词是莱布尼兹在1694年开始使用的,以描述曲线的一个相关量,如曲线的斜率或者曲线上的某一点.莱布尼兹所指的函数现在被称作可导函数,数学家之外的普通人一般接触到的函数即属此类.对于可导函数可以讨论它的极限和导