在用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

Python与C++引用分析相关推荐

  1. 一直在构建工作空间_国际资讯Python与地理空间分析

    点击图片上方蓝色字体"慧天地"即可订阅 英文原文来源:www.gislounge.com 英文原文链接:https://www.gislounge.com/python-and-g ...

  2. Python的弱引用

    python的弱引用指引用一个对象但不增加它的引用计数器.这么做的好处是什么呢?什么时候需要考虑用若引用呢? 假设我们在设计一个游戏,有一个角色类Char,我们要给他添加一个效果(比如中毒),于是设计 ...

  3. 非常易于理解‘类'与'对象’ 间 属性 引用关系,暨《Python 中的引用和类属性的初步理解》读后感...

    关键字:名称,名称空间,引用,指针,指针类型的指针(即指向指针的指针) 我读完后的理解总结: 1. 我们知道,python中的变量的赋值操作,变量其实就是一个名称name,赋值就是将name引用到一个 ...

  4. Python 爬虫实战:分析豆瓣中最新电影的影评

    Python 爬虫实战:分析豆瓣中最新电影的影评 接触python时间不久,做些小项目来练练手.前几天看了<战狼2>,发现它在最新上映的电影里面是排行第一的,如下图所示.准备把豆瓣上对它的 ...

  5. 以爬取知乎为例,进行python 多进程爬虫性能分析

    以爬取知乎为例,进行python 多进程爬虫性能分析 如果对多进程multiproessing模块不熟悉,请先浏览 python 使用multiprocessing模块进行多进程爬虫 问题背景: 爬取 ...

  6. 如何用Python进行历史股价分析

    如何用Python进行历史股价分析 一. 概述 二. 概念 三. 操作 3.1 统计分析 3.2 股票收益率 3.3 日期分析 3.4 周汇总 3.5 真实波动幅度均值 3.6 简单移动平均线 3.7 ...

  7. 连享会-Python爬虫与文本分析专题 (2019.5.17-19)

    连享会-Python爬虫与文本分析专题研讨班 文章目录 连享会-Python爬虫与文本分析专题研讨班 1. 课程概览 2. 嘉宾简介 3. 授课内容 3.1 课程介绍 为什么要学爬虫和文本分析? 为什 ...

  8. 使用python抓包并分析后存入数据库,或直接分析tcpdump和wireshark抓到的包,并存入数据库

    准备工作 抓包首先要用到scapy包 安装scapy包 pip install scapy 在python代码中引用scapy包 from scapy.all import * #为了省事,直接imp ...

  9. Python --深入浅出Apriori关联分析算法(二) Apriori关联规则实战

    上一篇我们讲了关联分析的几个概念,支持度,置信度,提升度.以及如何利用Apriori算法高效地根据物品的支持度找出所有物品的频繁项集. Python --深入浅出Apriori关联分析算法(一) 这次 ...

  10. python基础常用语句-python爬虫之python一条语句分析几个常用函数和概念

    https://www.xin3721.com/eschool/pythonxin3721/ 前言 过年也没完全闲着,每天用一点点时间学点东西,本文为大家介绍几个python操作的细节,包含all.a ...

最新文章

  1. UBUNTU安装SSH和xrdp
  2. 在script所在位置插入内容
  3. 数据安全防护之打造安全.mdb数据库
  4. poj 3101 Astronomy (java 分数的最小公倍数 gcd)
  5. 百度 android geocoding,百度地图经纬度批量查找功能XGeocoding使用手册(示例代码)
  6. redis远程连接不上_redis连接认证及bind的注意事项
  7. JS缺失错误- Uncaught SyntaxError: Unexpected token
  8. opencv 绘制图像直方图,实现直方图均衡化
  9. Linux系统升级硬盘后HOME分区扩容操作流程
  10. windows 安装 win32 win32com模块
  11. 图书馆管理系统可行性分析报告----软件工程
  12. 怎样用等价类划分设计测试用例
  13. plsql导出表结构语句
  14. python打开读取文件内容
  15. 从未谋面只闻其名——缅怀张孝祥老师!
  16. Linux中samba配置和windows映射Linux驱动盘
  17. 验证tensorflow是否安装成功
  18. 哈尔滨工业大学计算机复试英语,考研复试 | 哈尔滨工业大学复试经验贴
  19. 这一波再抢不到微信红包封面,就只能怪你自己了
  20. Lightly 如何优雅地给导师发工程文件?

热门文章

  1. buildroot 文件系统添加telnet, ssh, 以及制作注意事项
  2. 使用AsyncDisplayKit提升UICollectionView和UITableView的滚动性能
  3. C++中二维数组的动态分配
  4. 【C009】ArcGIS VBA - 学习
  5. Midletinfo-探索手机javaME系统信息的实用工具
  6. 资源冲突导致启动黑屏问题
  7. KVM 介绍(1):简介及安装
  8. Linux内核线程(一)
  9. 关于在windows中配置flew,glfw
  10. vue可填写表格_vue表格中添加一条数据且可编辑