本篇文章给大家分享的是有关Python与c++引用的示例分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
在用Python写建二叉树的代码的时候遇到了这个问题,原因就是把Python的“引”用与c++的“引用“搞混了,这两种语言中都有“引用“名词,虽然大部分时候很像,其实还是有区别的。这里记录一下,注意,这里只是我自己的一点个人理解,在找到更好的理解之前,先这样理解吧!
例子,这是我的两段根据先序序列创建二叉树的代码:
#,正确 pos =0 def 创建(seq): ,,,global pos ,,,ch =, seq (pos) ,,,pos +=1 ,,,if ch ==, & # 39; # & # 39;: ,,,,,,,return 没有 ,,,: ,,,,,,,temp =, TreeNode (ch) ,,,,,,,temp.left =,创建(seq) ,,,,,,,temp.right =,创建(seq) ,,,,,,,return 临时 , 时间=seq “公元abd # # # # # #”; 时间=root 创建(seq)
还有这个:
#,错误 def 创建(根): ,,,global pos ,,,如果(seq (pos)==& # 39; # & # 39;): ,,,,,,,root =,没有 ,,,,,,,pos +=1 ,,,,,,,回来 ,,,root =, TreeNode (seq [pos]) ,,,pos +=1 ,,,root.left =,没有 ,,,root.right =,没有 ,,,创建(root.left) ,,,创建(root.right)
看起来只是有无返回值的区别,实际上第二段代码是错误的,其实从第二段代码的思路来说,在c++里面可以这样写:
void 创建(tree ,, t) { ,,,char ch =, str (pos + +); ,,,如果(ch==& # 39; # & # 39;) { ,,,,,,,t =,空; ,,,,,,,返回; ,,,} ,,,t =, new 节点; ,,,t→val =, ch; ,,,创建(t→左); ,,,创建(t→右); }
这就是Python中与c++的引用的区别了。
我是这样理解的:Python中对内存的使用更像是不可改变的,对于一个引用所指向的对象,如果我要修改值,那么会先新找一块内存,赋值,然后将引用指向这个新的内存块,这样就是修改了引用指向的位置,但是在c++中则是直接在引用所指向的内存块上改变,例如:
Python: a =1 打印(id (a)) a =, + 1 打印(id (a)) #,输出 140708803374848 140708803374880
在c++中:
int t =, 1; int 及,a =, t; printf (“% d ,,, % d \ n",,,,,); a +=, 1; printf (“% d ,,, % d \ n",,,,,); #,输出 7208712,,,,1 7208712,,,,2
所以,就像上面的第二段代码,我传入了创建的树根的引用,但是当树的结构发生改变的时候,实际上是改变了存储的位置,这样原本的函数外面创建的根引用指向的其实还是原来的空内存块(突然觉得好傻. .就像被偷光了,还在等一样…),但是c++的引用就是很倔强地只认那一块内存,所以就可以直接改变使用了。
关于Python中引用与对象的关系,还牵扯到一些内存之类的知识,例如:
a =1 b =1 打印(id (a)) 打印(id (b)) #,输出 140708803374848 140708803374848 前>这里是因为Python中为了节省内存,会将一些短小的字符串以及数字进行缓存,这样就会节省这类对象的建立销毁的开销了。
其它的就还有关于可变数据对象(可变)和不可变对象(不可变的)了,这个我之前也记录过。总有些语言看起来很简单,但是实际上还是要好好理解的啊。以上就是Python与c++引用的示例分析,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。
Python与c++引用的示例分析