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

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

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

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

正确

pos = 0

def 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 = 1
print(id(a))
a = a+1
print(id(a))

输出

140708803374848

140708803374880
在C++中:

int t = 1;

int & a = t;
printf("%d %d\n", &a, a);
a += 1;
printf("%d %d\n", &a, a);

输出

7208712 1

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

a = 1

b = 1
print(id(a))
print(id(b))

输出

140708803374848

140708803374848
这里是因为Python中为了节省内存,会将一些短小的字符串以及数字进行缓存,这样就会节省这类对象的建立销毁的开销了。
其它的就还有关于可变数据对象(mutable)和不可变对象(immutable)了,这个我之前也记录过。总有些语言看起来很简单,但是实际上还是要好好理解的啊。

转载于:https://blog.51cto.com/14164498/2370321

你可能感兴趣的文章
用scrapy爬取ttlsa博文相关数据存储至mysql
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
AOP 的利器:ASM 3.0 介绍
查看>>
Redis数据结构详解,五种数据结构分分钟掌握
查看>>
解决Linux下编译.sh文件报错 “[: XXXX: unexpected operator”
查看>>
使用JConsole监控
查看>>
开发规范
查看>>
RAID技术
查看>>
excel 使用 navicat 导入数据库
查看>>
我的友情链接
查看>>
我的大学——我在科创协会的部长感悟
查看>>
数据结构之队列——顺序存储结构(php代码实现——方法一)
查看>>
Hive安装使用
查看>>
JDK 11的新特性
查看>>
MySQL优化20条经验(一)
查看>>
Linux修改时区
查看>>
ubuntu之R攻略
查看>>
《跟阿铭学Linux》第11章 正则表达式:课后习题与答案
查看>>
[软考]挣值管理EVM详细解释及应用,实例讲解收集(信息系统项目管理师-成本管理)...
查看>>