Python与c++引用的示例分析

  介绍

本篇文章给大家分享的是有关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++引用的示例分析