您现在的位置是:首页 > 文章详情

Python 传值还是传引用

日期:2018-08-19点击:261

在实现二叉树的代码时,使用递归调用,当给空叶子节点赋值的时候,发现只修改了局部变量。
因此研究了一下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语法很多不了解的地方。

原文链接:https://yq.aliyun.com/articles/635545
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章