id函数 / 可变类型变量 / 不可变类型变量 / +=操作
创始人
2024-05-28 21:25:01
0

前言

再说正文之前,需要大家先了解一下对象,指针和引用的含义,不懂得同学可以参考我上一篇博客“(12条消息) 引用是否有地址的讨论的_xx_xjm的博客-CSDN博客”

正文

一:python中一切皆对象

      “python中一切皆对象”这句话我相信凡是接触过python得同学应该都听过,但我想应该很少有人真正理解这句话,对此,本文在这里进行一个简单得阐述!

       在C++里面,我们说int a = 1; a就是一个对象,什么意思呢?在这里a代表了一个内存空间,我们假定这个内存空间的地址是x0001,那么a表示的是存放有1的x0001这个内存空间!所以,与其说a是一个对象,不如说是这个x0001是个对象。a和x0001的关系就是一个人和身份证上名字之间的关系,x0001就表示真实的人,a表示这个人身份证上的名字,比如“小明”。所以,我们简单理解一下,对象,就是一个真实存在的内存空间

      那么python中一切皆对象什么意思呢?还是拿上面的例子来说, int a = 1, 在这里,a代表了一个对象,一个真实的内存地址,那么1是什么呢? 1是一个立即数,是一个稍纵即逝的电流。但是在python里面对于a = 1这个式子,1其实是一个对象,也就是说,python里面,1表示的是一块存放值为1的内存空间!!!python一切皆为对象,就是说在python中,所有东西都是一个具体的内存空间!!,不管是数字,还是字符字符串,他们都是一个实际存在的内存空间

二:可变类型变量和不可变类型变量

       首先,我们先明确,python的数据类型有6中:数字number/ 字符串string / 元组 Tuple /  列表 list / 字典 dictionary / 集合 sets;(bool、int,float,complex(复数)等都属于number数字类型)

      可变类型变量:字典/列表/集合

      不可变类型变量:数字/字符串/元组

关于可变类型和不可变类型变量的定义参考自:python中可变类型和不可变类型 - 百度文库 (baidu.com)

1:可变类型变量,定义如下: 

也就是说可变类型变量实际上是对象的引用,也就是对象的别名,其实指代的还是对象本身,所以对象本身当然可以对自己的数据进行变换啦。(再次强调,关于引用和指针的关系参考“(12条消息) 引用是否有地址的讨论的_xx_xjm的博客-CSDN博客“)

 2:不可变类型变量,定义如下:

 所以,不可变类型变量实际上相当于对象的指针,它存储的只是对象的地址,比如a = 1,a这个变量存储的实际上是1这个对象的地址,当然我们也可以把a当作是一个对象,在c++里面,a这种存放地址的变量叫做指针变量,实际上也是一个对象,因为它也是一个实际存在的内存空间。

三:id函数的作用(个人理解,欢迎讨论,指正)

      id函数对于可变类型变量和不可变类型变量来说,其实作用是不同的,对于可变类型变量来说,比如a = 1,a是对象1得引用,也就相当于a就是1这个对象(这句话还不理解,再看看引用得含义),id(a)取得是对象1的地址; 而对于不可变类型变量,比如a = [1,2,3],a其实是一个指针变量,也就是说a本身也是一个对象,a有自己的地址,但id(a)取得是[1,2,3]这个对象得地址。

四: +=操作得真实含义

  关于 += 的代码层面的区别在于:参考:(12条消息) python的+=和=的区别_Liquor6的博客-CSDN博客

 

   先说结论:对于不可变类型对象:i += 1和 i = i+1是一样的,都会改变 i 的地址(真实的含义是,都会改变i这个指针指向的地址),逻辑上理解为,因为不可变类型变量是指针,i指向的是一个具体的数值对象,不同的数值对象对应的内存地址不同,所以当 i 指向的数值改变了以后,i指向的地址也就变了;

     举例: 比如本来i = 1,i是一个指针变量,它指向了1这个对象的内存地址,现在 i += 1和 i = i + 1,表示的都是说 i 这个指针要指向2这个对象的地址,所以,i 指向的地址肯定会从1变成2,这就是为什么不可变对象 += 和 =+是一样的操作。

实验如下

 

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

   同理,对于可变类型对象,比如a = [1,2,3], [1,2,3]是一个具体的对象,a是这个对象的引用,所以a += 1表示的是[ 1, 2, 3]这个对象自己加1,所以a还是这个对象的引用,但是a = a + 1则不同了,因为是引用,所以a = a + 1则表示a现在引用的应该是a + 1表示的[2,3,4]这个对象的地址,所以a = a + 1导致内存地址改变了。

实验如下:

 

结果:

 

可以看见,虽然a = [1,2,3,4],但是a这个[1,2,3,4]对象,实际上是[1,2,3]这个对象变来的,和本来的[1,2,3,4]对象是两个东西,也就是说,这里a和[1,2,3,4]对象表示的是两块内存空间,只不过两块内存空间保存的值是相同的。

再看a = a + [5]以后,这个时候a的地址是改变了的,它变成了[1,2,3,4,5]的地址,这里有一点小意思,因为我们是在a = a +[5]之前打印的[1,2,3,4,5]的id,所以,这时候[1,2,3,4,5]应该是已经被内存建立起来了,因此此时的a直接指向了[1,2,3,4,5]的内存地址,那么为什么此时[1,2,3,4,5]的地址和[1,2,3,4]的地址相同呢?因为这个时候,python其实是值记住了这个列表中1这个元素的地址,id([1,2,3,4])和id([1,2,3,4,5])返回的其实都是这个列表首元素1的地址。我们意义做如下实验,表明[1,2,3,4])和id([1,2,3,4,5]其实是一块地址空间:

 

 所以,我们来解释为什么这个时候a的地址就是[1,2,3,4,5]的地址,因为这时候内存中已经有一块连续的[1,2,3,4,5]了,并且这个值没有给任何变量(也就是没有引用),所以直接分配给了a。

那么为什么在a之后的[1,2,3,4,5]的地址又变成了最开始a=[1,2,3]的地址了呢?因为这时候a指向了新的[1,2,3,45]的地址,本来的[1,2,3]就被释放了,那么这时候的[1,2,3]就是没人管的了,那么python直接在这个基础上分发[1,2,3,4,5]的地址。由此可以看出python的内存管理机制确实很出色。更多的实验可以参照以下代码自己跑一遍:

 

补充:另外python中numpy数组是可变类型的, pytorch的张量和numpy数组共享底层内存,所以是可变类型,这就是为什么网络运行过程中,不能有原地+=操作。tensorflow的张量是不可变的。pytorch和tensorflow的张量确实是不同的。

参考:TensorFlow vs PyTorch 2: 张量(Tensor) - 简书 (jianshu.com)

五:由可变不可变类型对象引出的深浅拷贝

相关内容

热门资讯

初中英语作文常用短语(最新6... 初中英语作文常用短语 篇一常用短语对于初中英语作文的写作非常重要,它们能够帮助我们表达自己的观点和想...
没想到我如此幸运初中作文【最... 没想到我如此幸运初中作文 篇一我还记得那个夏天,天空湛蓝,阳光明媚。我刚升入初中,对新环境充满了期待...
勇敢主题作文300字初一(优... 篇一:勇敢面对挑战勇敢是一种心态,是一种积极向上的态度。在我们的成长过程中,我们常常会面临各种各样的...
一碗元宵-初中作文(优质5篇... 一碗元宵-初中作文 篇一元宵节是中国传统的节日之一,也是我最喜欢的节日之一。在这个特殊的节日里,我最...
阳光下真实_初中写景的作文9... 阳光下真实篇一初中写景的作文900字初秋的阳光洒满了整个校园,校园里的一切都显得格外美丽。我喜欢在阳...
我的第一次获奖经历初一作文(... 我的第一次获奖经历初一作文 篇一我的第一次获奖经历在我初一的时候,我参加了学校举办的一次作文比赛。这...
这次,换我好好爱你初中生作文... 这次,换我好好爱你初中生作文 篇一我亲爱的朋友,这次,我决定换我好好爱你。在过去的日子里,我一直是一...
厨神老爸初一作文(精简3篇) 厨神老爸初一作文 篇一我的爸爸是一个真正的厨神!他在烹饪方面非常有天赋,每天都能为我们家做出美味可口...
初一语文期中考试复习资料(通... 初一语文期中考试复习资料 篇一一、古文阅读古文阅读是初中语文考试中的重点和难点之一。在考试中,常常会...
难忘的一件事初一800字作文... 难忘的一件事初一800字作文 篇一初一的时候,我经历了一件让我难以忘怀的事情。那天,我和同学们去参观...
初中三年的规划与目标初一作文... 初中三年的规划与目标初一作文 篇一初中三年的规划与目标初中生活是一个关键的阶段,对于每个初一新生来说...
遇见作文精选范文初一(推荐6... 遇见作文精选范文初一 篇一我和小狗的邂逅今天,我和一只小狗邂逅了。这是一只可爱的小金毛,毛色金黄,眼...
初一自我介绍作文500字【精... 篇一:初一自我介绍作文500字大家好,我是初一(X)班的学生,今天很高兴能够在这里向大家进行自我介绍...
植物作文300字【精选6篇】 植物作文300字 篇一:植物的生命奇迹植物是地球上最为庞大和多样化的生命形式之一。它们以其独特的生命...
成长的烦恼初中作文(优质3篇... 成长的烦恼初中作文 篇一初中生活是我们人生中重要的一个阶段,这个阶段我们不仅要面对学习的压力,还要面...
米拉神奇历险记初一作文【优选... 米拉神奇历险记初一作文 篇一《米拉神奇历险记》是我最喜欢的一部动画片。它讲述了一只勇敢的小狗米拉在寻...
初中作文【精选6篇】 初中作文 篇一:我的暑假计划初中作文 篇二:如何提高英语口语水平初中作文 篇三作文二内容:在我的心中...
桃花源600字初一作文【最新... 桃花源600字初一作文 篇一迷失的桃花源桃花源,是一个神秘的地方,它位于偏远的山谷之中,被高山环绕,...
初一感恩作文800字(优秀6... 初一感恩作文800字 篇一感恩父母初一了,我终于踏入了中学的大门,开始了新的学习生活。回首这一路走来...
初三化学月考反思【优秀3篇】 初三化学月考反思 篇一这次的初三化学月考让我深刻地认识到了自己在学习上的不足之处。首先,在知识掌握方...