当前位置: 首页 > Linux

比较C++和Python,说说指针和引用

时间:2023-04-07 01:26:27 Linux

花猫语:本文是学习群樱雨楼小姐姐的投稿。她的一部作品《当谈论迭代器时,我谈些什么?》已经出版,受到好评。本文仍然是通过比较C++和Python来讨论编程语言中极其重要的概念。祝大家读书学习顺利!樱玉楼|原作者猫下豌豆花|编辑润色原文地址:https://mp.weixin.qq.com/s/k0...0简介指针(Pointer)是C、C++、Java、Go等语言中非常核心和重要的概念,并且引用(Reference)是建立在指针之上的一个同样重要的概念。指针对于任何编程语言都是必要且重要的。虽然Python有意模糊和限制了指针的概念,但指针仍然是Python必须深入探讨的话题。本文基于C++和Python,讨论Python中与指针和引用相关的一些行为。1什么是指针?为什么需要指针?指针有两层含义:(1)指的是某种数据类型的指针类型,如整型指针类型,指针指针类型(2)指的是存储内存地址的变量类型,即两层含义指针变量指针是密切相关的:作为一个变量,可以通过指针获取某个内存地址,为访问该地址的值做准备;作为一个类型,它决定了内存地址的正确偏移长度,它应该等于当前类型的单位内存大小。如果一个指针缺少指针类型,即void*,显然,虽然它保存了一个内存地址,但它只是一个起点地址,指针将拒绝分解指针,因为它无法知道从起点向后的偏移量观点;而如果一个指针缺少地址,即nullptr,它根本无法读取特定位置的内存。指针存在的意义主要有以下几点:承载通过malloc、new、allocator等获取的动态内存,使得指针传递成为可能。pass-by-pointer的好处包括但不限于:避免对实际参数Copy无意义的值,大大提高了效率,使得修改变量的能力不局限于变量本身的范围,所以swap、moveconstructor、moveassignment等操作只能对数据结构内部的指针进行操作,从而避免了临时对象。对象的整体内存操作,如、移位源等。可见,所有与指针相关的操作,对于编程来说都是必须的或者非常重要的。2C++中的引用在C++中,引用具有与指针类似的性质,但更加隐蔽和严格。C++的引用分为以下两种:2.1左值引用左值引用在其初始化阶段绑定到左值,不存在重新绑定。左值引用与绑定左值具有几乎相同的属性,唯一的区别是decltype声明:intnumA=0,&lrefA=numA;//绑定一个左值cout<<++lrefA<sampleNum(newint(0));3.2.2__setitems__操作会隐式解决指针Python与指针的另一个重要联系在于Python隐式解决指针的行为。尽管Python没有显式的非指针操作,但(也是唯一的)__setitems__操作将执行隐式的非指针操作。通过该方法修改一个变量,相当于通过反指针操作修改变量的原始值。此属性意味着任何不涉及__setitems__的操作都将是指针重新绑定。对于Python代码:numList=[None]*10#RebindingnumList=[None]*5相当于:int*numList=newint[10];//Rebindingdelete[]numList;numList=newint[5];delete[]数列;可以看出,对numList的非__setitems__操作导致numList绑定了一个新的指针。任何涉及__setitems__的操作都是depointer操作。由于Python对哈希表的高度依赖,“涉及__setitems__的操作”在Python中其实是一个非常广泛的行为,主要包括:涉及__setattr__的数组索引操作和哈希表查找操作(由于Python将属性存储在哈希表中,因此__setattr__操作最终将成为某种__setitems__操作)我们用一个稍微复杂一点的例子来说明这一点:对于以下Python代码:classComplex(object):def__init__(self,real=0.,imag=0.):自己。真实=真实的自己。imag=imagdef__repr__(self):返回'(%.2f,%.2f)'%(self.real,self.imag)defmain():complexObj=Complex(1.,2.)complexObj.real+=1complexObj.imag+=1#(2.00,3.00)print(complexObj)if__name__=='__main__':main()等价于:classComplex{public:doublereal,imag;复数(double_real=0.,double_imag=0.):real(_real),imag(_imag){}};ostream&operator<<(ostream&os,constComplex&complexObj){返回os<<"("<real++;完成exObj->图像++;cout<<*complexObj<”或“*”非指向操作。4后记本文讨论Python变量与指针和引用的关系,主要论证“Python没有引用”和“Python变量表现得像某种不完整的指针”这两个论点。所有论点均为作者个人观点,如有错误,敬请指正。公众号【Python猫】,本号连载系列精品文章,包括喵星哲学猫系列、Python进阶系列、好书推荐系列、技术写作、优质英文推荐与翻译等,欢迎收看注意。