热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python与C++引用分析

在用Python写建二叉树的代码的时候遇到了这个问题,原因就是把Python的“引用”与C++的“引用”搞混了,这两种语言中都有“引用”名词,虽然大部分时候很像,其实还是有区别的。

在用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)了,这个我之前也记录过。总有些语言看起来很简单,但是实际上还是要好好理解的啊。


推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 给定一个二维平面上的一些点,通过计算曼哈顿距离,求连接所有点的最小总费用。只有任意两点之间有且仅有一条简单路径时,才认为所有点都已连接。给出了几个示例并给出了对应的输出。 ... [详细]
  • 本文介绍了基于c语言的mcs51单片机定时器计数器的应用教程,包括定时器的设置和计数方法,以及中断函数的使用。同时介绍了定时器应用的举例,包括定时器中断函数的编写和频率值的计算方法。主函数中设置了T0模式和T1计数的初值,并开启了T0和T1的中断,最后启动了CPU中断。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 开发笔记:select from具体执行相关知识介绍及案例分析
    本文由编程笔记小编整理,主要介绍了select from具体执行相关的知识,包括数据插入、查询最小rowID、查询每个重复名字的最小rowID、删除重复数据等操作,并提供了案例分析。希望对读者有一定的参考价值。 ... [详细]
author-avatar
夏未夏至青_872
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有