当前位置: 首页 > 后端技术 > Python

作为程序员的基本素养,你了解Python的变量引用吗?

时间:2023-03-26 19:04:21 Python

在我们的编程中,变量是最基本的概念。它和我们用来建造建筑物的砖一样重要。这是必不可少的。因此,了解变量的工作原理至关重要。九层台,始于地基;拥抱它的树始于小米的末端;千里之行,始于足下!今天就来说说Python变量的那些事儿。1.变量不是盒子让我们看下面的代码1.a="hello,world"2.b=a3.c=[1,2,3]对于我们初学者来说,变量的赋值是最容易进错地方的。最常见的误解是什么?定义一个变量,在内存中创建一个变量框,然后把变量的值放到这个框里。让我们看看下面的图片。这种想法是完全错误的。正是由于这种误解,我们的代码可能会遇到很多问题。什么是正确的?分配变量时你做了什么?2.奇怪的变量1.a="hello,world2.b=a3.c=[1,2,3]那么上面的代码是干什么的呢?在此之前,先给大家讲个故事。上个世纪90年代,我们著名的大蟒蛇自助餐厅开业了,顾名思义,这家餐厅主要是自助餐,但是什么?每个顾客只能吃一种食物,食物会分发到不同的房间,食物种类不固定,客人可以提供他们需要的东西。有一天,我们的小同学A来到餐厅,跟前台说我想吃“hello,world”,于是酒店前台新开了一间餐厅。房间号是:00010,把我们的“hello,world”放在里面,给了一个通行证,这个通行证只能去00010房间。然后记录hello,world:eat人数:1。当a想吃饭的时候,他拿着通行证去00010房间取。没多久,小b也来我们酒店,跟酒店前台说我想吃和a一样的东西。于是酒店前台,还给了b一张通行证,b也可以去00010房间打招呼,世界根据通行证。酒店前台又记录了:你好,世界:就餐人数:2紧接着,我们的小同学c也来了,他和b不一样,有他想吃的。他跟酒店前台说:我要吃饭[1,2,3]。客户有新的需求,酒店前台新开了一个房间,房间号是:00020,也把[1,2,3]放在里面。也给c一个通行证。然后记录:[1,2,3]:吃饭的人数:1我们可以拿着这个故事往下看。根据这张图,在我们上面的故事中:customersa,b,c:变量a,b,c\酒店:内存空间酒店前台:Python解释器房间:为对象划分的内存空间食客数:引用计数通信许可证号:变量引用的内存地址其实我们给变量赋值的时候,我们的变量并没有存储这个值。相反,它绑定了一个内存地址id。当我们要使用这个变量的值时,就去内存中找这个地址的存储值。接了上面的故事,我们小同学a吃腻了hello,world,NowI'mbeingeating123456,就跑到酒店前台说,我现在想吃123456,酒店前台什么也没说,开了一个新房间,房间号是00030,里面有123456,更新了a同学的通行证,此时这张通讯卡只能去00030房间吃123456,前台继续记录hello,world:Numberofservings:1,123456:Numberofservings:1在代码中,我们改变变量a的值,会发生什么?我们再来看一下,当我们改变a的变量时会发生什么?a=123456会这样做吗?当我们改变a的值时,并不会直接改变a指向的内存地址存储的值,而是开辟一个新的空间来存储新值123456,将a指向的地址改为00030新建空间,如下图所示。正确的应该是这样的:我们的B同学很喜欢模仿,现在她不想吃hello,world了。于是跑下楼到酒店前台说:我要吃[1,2,3]。注意,b同学这次说的是我想吃[1,2,3],而不是我想和c一样吃。虽然他们的食物是一样的。但是我们前台不会直接给b00020房间通行证,而是新开一个房间,房间号00040,把[1,2,3]放进去,给b通行证指向00040房间。同事记录(00040)[1,2,3]:吃饭人数:1,(00010)你好,世界:吃饭人数:0b=[1,2,3]为什么?其实这里很好理解,因为我们在给b赋值的时候就创建了一个新的对象。每当创建新对象时,都会重新打开空间。但是,像这样b=c并没有创建新的对象,而是将c的引用传递给b,它们都指向一个对象。这里的朋友们注意了,不要被我的例子误导了。这时候我们酒店前台发现00010房间的hello,world已经吃不下了。这时候酒店前台会收回房间,扔掉里面的hello,worldfood。这就是python的垃圾回收机制。这时候我又来了以为d同学,d跟酒店前台说我想吃和c一样的食物,酒店前台给d发了通行证。根据通行证,d可以去00020房间拿[1,2,3]。酒店前台再次记录:[1,2,3]:吃饭人数:2d=c但是我们同学d很挑剔,他对现有的[1,2,3]不满意,他想加点菜,正好前面台说加菜:这时候00020房间的东西变成了[1,2,3,4]d.append(4)这时候我们发现一道题,c同学什么都没做,但是他能吃的食物从[1,2,3]变成了[1,2,3,4],这是什么问题?为什么a从"hello,world"变成123456时我们开辟了一个新的空间。但是现在d从[1,2,3]变成了[1,2,3,4],但是直接修改在原始内存空间?这是经典的python面试问题:对象的可变性?什么是可变对象,什么是不可变对象?3.可变对象和不可变对象在python中,一切都是对象,但是这个对象也分为两类:可变对象(三):List(列表)、Dictionary(字典)、Set(集合)不可变对象(三):Number(数字)、String(字符串)、Tuple(元组)在Python中看可变和不可变数据类型,主要看变量指向的内存地址处的值是否会发生变化。3.2不可变对象>>>a=10000>>>id(a)139964684838128>>>a=30000#不可变对象,改变一个变量的值其实就是实例化一个新对象,开辟新的内存空间>>>id(a)#产生了新的内存地址,表示不再是原来的对象139964684837872>>>3.3变量对象>>>a=[1,2,3]>>>b=a>>>id(a)139711046464264>>>id(b)139711046464264>>>b.append(4)#可变对象,允许改变对象的值>>>id(b)139711046464264#内存地址没有改变,表示在原来的内存空间改变值>>>id(a)139711046464264>>>b[1,2,3,4]>>>a[1,2,3,4]总结:变量对象:变量指向的内存地址值是可以改变的不可变对象:变量指向的内存地址处的值不能改变。