博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python与C++引用分析
阅读量:6288 次
发布时间:2019-06-22

本文共 1683 字,大约阅读时间需要 5 分钟。

hot3.png

在用Python写建二叉树的代码的时候遇到了这个问题,原因就是把Python的“引用”与C++的“引用”搞混了,这两种语言中都有“引用”名词,虽然大部分时候很像,其实还是有区别的。这里记录一下,注意,这里只是我自己的一点个人理解,在找到更好的理解之前,先这样理解吧!

例子,这是我的两段根据先序序列创建二叉树的代码:

# 正确pos = 0def create(seq):    global pos    ch = seq[pos]    pos += 1    if ch == '#':        return None    else:        temp = TreeNode(ch)        temp.left = create(seq)        temp.right = create(seq)        return temp seq = "abd###ce###"root = create(seq)

还有这个:

# 错误def create(root):    global pos    if(seq[pos]=='#'):        root = None        pos += 1        return    root = TreeNode(seq[pos])    pos += 1    root.left = None    root.right = None    create(root.left)    create(root.right)

看起来只是有无返回值的区别,实际上第二段代码是错误的,其实从第二段代码的思路来说,在C++里面可以这样写:

void create(tree & t){    char ch = str[pos++];    if(ch=='#'){        t = NULL;        return;    }    t = new node;    t->val = ch;    create(t->left);    create(t->right);}

这就是Python中与C++的引用的区别了。

我是这样理解的:Python中对内存的使用更像是不可改变的,对于一个引用所指向的对象,如果我要修改值,那么会先新找一块内存,赋值,然后将引用指向这个新的内存块,这样就是修改了引用指向的位置,但是在C++中则是直接在引用所指向的内存块上改变,例如:

Python:a = 1print(id(a))a = a+1print(id(a))# 输出140708803374848140708803374880

在C++中:

int t = 1;int & a = t;printf("%d    %d\n", &a, a);a += 1;printf("%d    %d\n", &a, a);# 输出7208712    17208712    2

所以,就像上面的第二段代码,我传入了创建的树根的引用,但是当树的结构发生改变的时候,实际上是改变了存储的位置,这样原本的函数外面创建的root引用指向的其实还是原来的空内存块(突然觉得好傻。。就像被偷光了,还在等一样。。。),但是C++的引用就是很倔强地只认那一块内存,所以就可以直接改变使用了。

关于Python中引用与对象的关系,还牵扯到一些内存之类的知识,例如:

a = 1b = 1print(id(a))print(id(b))# 输出140708803374848140708803374848

这里是因为Python中为了节省内存,会将一些短小的字符串以及数字进行缓存,这样就会节省这类对象的建立销毁的开销了。

其它的就还有关于可变数据对象(mutable)和不可变对象(immutable)了,这个我之前也记录过。总有些语言看起来很简单,但是实际上还是要好好理解的啊。

原文来自: 

转载于:https://my.oschina.net/ssdlinux/blog/3029485

你可能感兴趣的文章
《Node.js入门经典》一2.3 安装模块
查看>>
《Java 开发从入门到精通》—— 2.5 技术解惑
查看>>
Linux 性能诊断 perf使用指南
查看>>
实操分享:看看小白我如何第一次搭建阿里云windows服务器(Tomcat+Mysql)
查看>>
Sphinx 配置文件说明
查看>>
数据结构实践——顺序表应用
查看>>
python2.7 之centos7 安装 pip, Scrapy
查看>>
机智云开源框架初始化顺序
查看>>
Spark修炼之道(进阶篇)——Spark入门到精通:第五节 Spark编程模型(二)
查看>>
一线架构师实践指南:云时代下双活零切换的七大关键点
查看>>
ART世界探险(19) - 优化编译器的编译流程
查看>>
玩转Edas应用部署
查看>>
music-音符与常用记号
查看>>
sql操作命令
查看>>
zip 数据压缩
查看>>
Python爬虫学习系列教程
查看>>
【数据库优化专题】MySQL视图优化(二)
查看>>
【转载】每个程序员都应该学习使用Python或Ruby
查看>>
PHP高级编程之守护进程,实现优雅重启
查看>>
PHP字符编码转换类3
查看>>