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<<"("<真实++;complexObj->imag++;cout<<*complexObj<”或“*”不指向操作。4后记本文讨论Python变量与指针和引用的关系,主要论证“Python没有引用”和“Python变量表现得像某种不完整的指针”这两个论点。以上就是本次分享的全部内容。想了解更多python知识,请前往公众号:Python编程学习圈,发“J”免费领取,每日干货分享