Python 传值还是传引用
在实现二叉树的代码时,使用递归调用,当给空叶子节点赋值的时候,发现只修改了局部变量。
因此研究了一下Python中传值和传引用的问题。
实验
实验一
a = None print(id(a)) b = None print(id(b))
4321685368
4321685368
结论: 结果指向同一块区域
实验二
def test(x): x = x+2; a = 2 print(a)
2
结论: 没有改变原变量
实验三
def test(x): x = [1,2,3] a = [1,2] print(a) print(id(a)) test(a) print(a) print(id(a))
[1, 2]
4370314760
[1, 2]
4370314760
结论: 没有改变原变量地址
实验四
def arrayadd(x): x.append(1) a = [1,2] print(a) print(id(a)) arrayadd(a) print(a) print(id(a))
[1, 2]
4370399624
[1, 2, 1]
4370399624
结论:变量地址不变,值改变。
如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“传引用”来传递对象。
如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象--相当于通过“传值'来传递对象。
实验一、二说明不可变对象的使用方法。
实验四,说明了可变对象的使用方法。
实验三,使用赋值操作要注意没有改变原对象,相当于传值。
二叉树问题
def _insert_(self,node,key,value): print(id(node)) print(id(self.root)) if(node==None): node = Node(key,value) self.count = self.count+1 print(id(node)) print(id(self.root)) elif(node.value>key): self._insert(node.lnode,key,value) elif(node.value<key): self._insert(node.rnode,key,value) else: node.value = valu
如果 node =None,相当于node指向一个不可变对象,在调用insert函数时,仅传值。
Python构建二叉树参考代码:node必须不为None,如果为None则创建节点。
def _insert(self,node,key,value): if(node.key == key): node.value = value elif(node.key > key): if(node.lnode == None): node.lnode = Node(key,value) self.count = self.count+1 return else: self._insert(node.lnode,key,value) elif(node.key < key): if(node.rnode == None): node.rnode = Node(key,value) self.count = self.count + 1 return else: self._insert(node.rnode,key,value)
总结:作者本着折腾自己的想法,将用java和c写的数据结构,都用Python实现一遍,帮助记忆。这个过程中,还是发现对python语法很多不了解的地方。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
程序员编程,你的练习是不是有效的?
对于我来说,提升技能的项目会有四种: 纯兴趣驱动的项目。即我的Idea列表上的一个个酷炫的项目,先满足自己再说。 理论驱动的项目。这一类的项目会比较少,因为我们需要牵强地驱动出这样的项目,然后以理论的方式驱动它。 兴趣结合理论型。有一个长长的Idea列表,难免有些时间会和将要学习的理论有很大的交集。这种的练习效果是最好的。 整合成文章、电子书。这一步主要是为了分享、巩固知识点、讨论。 简单地来说,就是: 刻意的理论练习 兴趣实践 两种不同的走向,上面的第三点和第四点,算是获得一些更好的效果。开始之前,让我们再次讨论一下情绪周期的问题。 编程与情绪周期 如果你每天都有很多可支配的自由时间时,你也会观察出情绪周期这件事。 所谓“情绪周期”,是指一个人的情绪高潮和低潮的交替过程所经历的时间。 这种周期看上去就好像是一图所示,但是总体上好像会长一点。 这一点在我的GitHub上看起来就有点明显了,至少它是一年的一个周期: 对于我来说,我会交替写代码和写博客、电子书。因为它以一定的规律在迭代着: 适合写大量代码的日子 适合学习理论的日子 适合玩游戏《文明》、看电影、睡觉的日子。一般...
- 下一篇
分享某行软件开发中心的两道python笔试题
两道笔试题都是选择题,两个知识点,容易做错。 第一题 ## 下面程序执行结果 x = 2 def b(a): x = x+a b(3) print(x) 此段程序运行报错,UnboundLocalError: local variable 'x' referenced before assignment 应采用global关键字定义全局变量 x = 2 def b(a): global x x = x+a b(3) print(x) 第二题 a = [x for x in range(3)] import numpy as np a = np.array(a) a**a [1,1,4] 0**0 = 1,容易犯迷糊。
相关文章
文章评论
共有0条评论来说两句吧...