课时30:变量和对象
摘要:本节课时主要学习了对象的结构和存储方式,以及变量和对象的关系。首先,介绍了对象的结构和存储方式,并详细解释了变量的存储方式。其次,学习了在创建对象时如何处理变量a,并建立变量与对象之间的联系。再次,介绍了在内存中创建新对象的过程,强调了变量和对象的独立性,并解释了不同类型之间的运算问题。最后,介绍了类型转换的概念和应用,强调了类型转换是创建新对象,而非改变原有对象。同时,介绍了类型转换的四个函数,其中 int 函数可以用于将其他对象转换为整型。
1. 对象结构和变量存储关系
2. 变量与对象的关系及内存地址
01.对象结构和变量存储关系
1.1 回顾对象结构
回顾对象的结构,对象分了三个部分 Id、Type和 Value。然后在 lesson_02中创建了一个文件夹叫做img (MG图片),把图1图2(截的图)放在文件夹中了,也就是可以根据图片来看一下,需要用图的时候到文件夹中找一下就好。对象讲完以后,其实示意图中有一个东西没有体现出来,因为我们现在只写了值,但是实际上的情况是我们这除了值以外,应该还有一个变量,应该是a=123或者a=‘Hello’,还需要有一个变量,所以接下来我们再来整理一下变量和对象的一个关系。
1.2 对象和变量的关系
变量和对象有什么关系呢?例如:写一个 a=3。问题来了,a=3是什么意思?那是不是把3这个值存储到了变量a中呢?注意,不是的。如果之前是这么认为的,现在一定不能这么认为了。为什么呢?因为3看上去它只有一个3,但是实际上在内存中它也是一个完整的区域,所以它不仅仅是一个3,实际上它是一个对象。那么变量是如何存储对象的呢?
1.3变量要怎么存储对象
实际上对象并没有直接存储到变量中,在 Python中,变量其实不像变量,它更像是对象的一个别名,相当于你现在来看这个对象,要想直接去操作对象,这样实际上是不太好操作的。如一个a=123,相当于给这块区域起了名字,这块区域叫a了,以后我们再去找 a,想去找这个对象,就可以直接通过a去找了。注意在 Python 中其实这个变量它不像变量,更像一个对象的别名。如果用一个没有定义过的变量,比如说来一个b没有定义过的变量,这一执行它会给你报错叫做Name Error。它并没有说是变量错误,它说名字错误 Name,name ‘b’ is not defined,它说b是一个 Name,并没有说b是一个 Variable是一个变量,所以在 Python 中这个变量它更像是一个名字。
1.4变量中存储的是什么变量
Python中变量更像是给对象起了一个别名,这一块我们用画图来演示。把代码换成 a=123,把黄色部分删除,现在这有一个a=123,这又与之前不一样了,这里多了一个变量a。既然有东西那也需要存到内存中,所以注意实际上变量也是要存到内存中的,我们先暂且这么认为。在我们内存中会有一个专门的区域,这个区域专门用来存储变量,画一个绿色区域,这个区域专门用来存储变量,它像一个表格似的表格似的,它分两列,一列是变量,还有一列是值。当这儿写了一个a=123以后(注意这一定是先执行右边再执行左边的),所以在这一块需要先创建123这个对象在内存当中。复制一个对象(黄色区域)中有 Id、Type、和 Value,123这个对象我们就创建好了。
02.变量与对象的关系及内存地址
接下来来处理变量,变量a有了,就需要在变量这个区域创建一个变量,变量的名字叫a,现在问题来了,变量在绿色区域,而对象在黄色区域,它们两个之间没有联系,也就说现在是没有关系的,如果要想体现出变量a和123的联系,要在变量里跟对象建立起关系。怎么建立关系呢?只需要在变量里存一个东西就行,存一个对象唯一的东西,也就是它的内存地址,即Id。也就是说,a=123,它里边存的并不是123这个值,而是123这个对象的内存地址。现在就相当我a里边有一个类似于指针的东西指向了这个对象。
注:变量中存储的不是对象的值,而是对象的Id(内存地址),当我们使用变量时,实际上在通过对象Id在查找对象。这一点时刻要记住,在变量里有没有存东西,存的是什么?存的是对象的地址(存的是对象的 Id)。写了这个a后,当使用这个a的时候,因为它里面存的是地址,这个地址是唯一的,解析器就可以根据这个地址找到对象。现在有一个a=123,实际上在a中存的是一个0x111,然后当去打印a的时候,解析器一看打印a,去看a中存的是什么?存的是0x111,然后就会通过这个地址找到对象。所以注意变量里存的是对象的Id,不是对象的值,存的是对象的 Id。
例如:写一个b=a,已知a=123。写一个新的变量b,b=a就是等于a的值,a的值是内存地址。b=a后b的内存地址也是0x111,它也会去指向对象,也就是说a和b它们指向的是同一个对象。
打开 Python的交互模式,写一个a=10,然后Id(a)打印看一下a的内存地址(括号别写错了 ,这是一个小写的英文的括号)。
然后再写一个b=a打印一下b,b的值也是10。再看一下Id(b),发现Id(b)跟 Id(a)的值是一样的,因为他们现在指向的是同一个地址。
再写一个a=456,现在的问题是这有了一个a=456,它会不会对b产生影响?很明显这是不会的,因为a=456是一个新的对象。等于要在内存当中创建一个新的对象,这个对象的地址是什么解析器也不知道。假设写一个id=0x211,类型还是int,这时值变成了456,然后注意a现在是456也就是说a这块的地址已经不是0x111了,变成0x211了。然后这个箭头也不是指向原来123了,变成指向新的对象了。这时b还是不会受影响,因为这是在给a进行重新赋值,b没有影响b还是指向的是0x111。
所以这个演示起来也非常简单,现在来看 a是10,b也是10,写一个a=20,改变了a的值,再打印一下a是20,b还是10。这对b没有产生任何影响。
注:变量中保存的对象。只有在重新赋值时才会改变,只有在为变量重新赋值时才要改变。这是什么意思呢?例如:这有一个变量a,变量a=20,也就是说,一旦给它设置成a=20,a基本上是不会变的。除非写了一个a=30才会变,这就相当于给变量a重新赋值了,这时它才会改变。不重新赋值它永远都不会变,这一点一定要注意,变量中的保存的对象只有在为变量重新赋值时才会改变。注意这句话就省事了,因为严格来说变量中保存的是对象的地址对象的Id,只有在为变量重新赋值时才会改变。
注:变量和变量之间是相互独立的,相互独立的变量和变量之间是相互独立的,修改一个变量它并不会影响什么。一个不会影响另一个,修改a对b没有产生任何影响。
以上就是变量和对象,待会把这图也截下来,这个图三一定注意。变量里边存的是内存地址,并且变量之间是相互独立的修改,修改一个不会影响另一个,并且变量只有再重新赋值的时候才会才会改变。