查看原文
其他

【基础篇】Python可变对象与不可变对象

爬虫俱乐部 Stata and Python数据分析 2023-01-01

本文作者:孙一博,中南财经政法大学金融学院

本文编辑:张   猛

技术总编:王子一

Stata&Python云端课程来啦!

      为了平衡团队运营成本,维系公众号的运营,也与国内动辄数千元的Stata课程缩短差距,我们的网课不得不上调价格,我们决定于2022年5月15日起调价,Python课程的价格调整为439.9元Stata基础课程调为439.9元Stata进阶课程调整到439.9元。大家可以告知一下身边想要购买的小伙伴,欲购从速哦,对报名有任何疑问欢迎在公众号后台和腾讯课堂留言~我们在这篇推文提供了每门课程的课程二维码,大家有需要的话可以直接扫描二维码查看课程详情并进行购买哦~



前言

在Python中,我们都有听过“一切皆为对象,一切皆为对象的引用”。每个对象都有各自的编号、类型和值。一个对象被创建后,它的编号就绝不会改变,可以将其理解为该对象在内存中的地址。使用 id( ) 函数能返回一个代表其编号的整型数,也就是它的内存地址。

日常使用中,可变对象包含字典(dict)、列表(list)等,在ID不变的情况下,可以改变对象的值。不可变对象包含整型(int)、浮点型(float)、字符串型(string)和元组(tuple)等,对象的值一旦改变,其ID也改变。

下面我们分别以列表(list)和元组(tuple)为例,直观呈现可变对象与不可变对象的区别。


一、可变对象
list_1=[10,20,30,40]id(list_1) #输出list_1的内存地址
输出结果:

list_1.append([80,90,100]) #在原列表尾部增加一个子列表id(list_1) #输出list_1的内存地址,ID保持不变

输出结果:

以列表为例,将子列表[80,90,100]合并到原列表后,列表值发生变化,但其内存地址ID保持不变。这是由于列表是可变对象,允许在其指向的内存空间就地修改元素,而不生成一个新的对象。
二、不可变对象
tuple_1=('a','b','c','d')id(tuple_1)#输出tuple_1的内存地址,ID发生变化
输出结果:

tuple_1+=('x','y') #在元组内加入新的元素id(tuple_1)

输出结果:

将元素x、y加入元组后,元组的ID在前后发生变化。这是由于元组本身不可变,在进行“+=”运算符操作时,将创建一个新元组,然后重新绑定给对象tuple_1,相当于执行“tuple_1=tuple_1+('x','y'),前后并不是同一个对象。
三、对不可变性的说明
我们所说的可变对象与不可变对象是针对对象的值而言。一个不可变容器对象如果包含对可变对象的引用,当后者的值改变时,前者的值也会改变;但是该容器仍属于不可变对象,因为它所包含的对象集是不会改变的。因此,不可变并不严格等同于值不能改变,即是相对不可变。
以元组为例,对它来说更确切的定义是相对不可变性。与大多数python集合(列表、字典、集,等等)一样,元组保存的是对象的引用。如果引用的元素是可变的,即便元组本身不可变,元素依然可变。也就是说,元组的不可变性实质上是指tuple数据结构的物理内容(即保存的引用)不可变,与引用的对象无关。
下面先来看一段程序:
tuple_2=(5,10,15,20,[7,8,9])id(tuple_2)

得到结果:

id(tuple_2[-1]) #输出最后一个元素的内存地址

得到结果:

tuple_2[-1][1]='abc' #改变最后一个元素的值print(tuple_2)id(tuple_2) #输出改变后元组的内存地址,ID未发生变化

得到结果:

如上,元组tuple_2的最后一个元素tuple_2[-1]引用的是可变列表对象,我们直接改变这一元素的值,也使得整个元组tuple_2的值发生变化。但由于该可变列表元素的标识ID不变,元组的ID也不改变,相当于就地修改了元组中特定元素的值。
接下来,进一步尝试修改元组本身的数据结构,在其后面增加新的元素。此时,元组tuple_2的ID发生变化,表示内存中新生成了一个对象,其值为“tuple_2=tuple_2+(10,20)”。若没有其他变量名或对象引用的话,原对象占用的内存空间将被回收。
tuple_2+=(10,20) #在元组内增加新的元素print(tuple_2)id(tuple_2) #输出元组的内存地址,ID发生变化

得到结果:

总之,概括上述过程就是:对于python中的不可变对象,如果改变了变量的值,相当于是新建了一个对象;对于可变对象,如果对变量进行append、“+=”等一类的操作后,只是改变了变量的值,而不会新建一个对象,变量引用的对象的地址也不会变化。


END
最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。




腾讯课堂课程二维码








            


 对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!











往期推文推荐

Stata绘图系列——细节掌控绘图区域!

      4月A股的收官战之概念板块哪家强?

解放双手!你必须要会的两个命令—inlist & inlist2

【基础篇】字符串之判断方法

Stata绘图系列——让你的直方图随心所欲

【爬虫篇】湖人无缘季后赛,球迷如何回应

客官,要来份四象限图吗?

Python实现简繁体转换

Stata与Python交互方法及数据传递

 “青铜”爬“王者”

 留下想要的变量,你会几种方法?

 Python:朋友圈配图,我承包了

 绘制全国祠堂密度地图

 如何使用Stata绘制一幅好看的柱状图?

【爬虫篇】基于selenium爬取美团评论

 双标的莱万——足球无关政治?!

 Stata处理重复值:duplicates

It's time to send a flower to your lover!        2021各省GDP新鲜出炉

 爬虫实战-采集全国各省疫情数据

 log——为你的操作保驾护航

 一行代码教你玩转emoji

 票房遇冷的春节档口碑冠军丨《狙击手》影评分析

 学习丰县,营造良好营商环境!

 大国丢娃图:从川渝到徐州!

 丰县“失火”,殃及徐州:股市超跌近30亿!

 Unicode转义字符——编码与解码

        徐州!徐州!

        B站弹幕爬虫——冬奥顶流冰墩墩&雪容融

        不会用Stata做描述性统计表?so easy!

        丰沛之地:备足姨妈巾

 过年啦,用Python绘制一幅属于你的春联吧!

       登上爬虫俱乐部“时光机” |上“机”出发 开启一段奇妙之旅

       【基础篇】查找并输出子字符串的定位

        Stata中的小清新命令——添加观测值

        PCA(主成分分析法)降维——Python实现

       超好用的事件研究法

        如何绘制任泽平《鼓励生育基金》的几幅图

关于我们 


   微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

   武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。



此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。

投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里
为作者署名,并有赏金分成。

2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众
号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存