Python 传值还是传引用

简介: 在实现二叉树的代码时,使用递归调用,当给空叶子节点赋值的时候,发现只修改了局部变量。因此研究了一下Python中传值和传引用的问题。实验实验一a = Noneprint(id(a))b = Noneprint(id(b))432...

在实现二叉树的代码时,使用递归调用,当给空叶子节点赋值的时候,发现只修改了局部变量。
因此研究了一下Python中传值和传引用的问题。

实验

实验一

a = None
print(id(a))
b = None
print(id(b))
AI 代码解读

4321685368
4321685368

结论: 结果指向同一块区域

实验二

def test(x):
    x = x+2;
a = 2
print(a)
AI 代码解读

2

结论: 没有改变原变量

实验三

def test(x):
    x = [1,2,3]

a = [1,2]
print(a)
print(id(a))

test(a)
print(a)
print(id(a))
AI 代码解读

[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))
AI 代码解读

[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
AI 代码解读

如果 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)
AI 代码解读

总结:作者本着折腾自己的想法,将用java和c写的数据结构,都用Python实现一遍,帮助记忆。这个过程中,还是发现对python语法很多不了解的地方。

目录
打赏
0
0
0
0
1
分享
相关文章
|
11月前
|
Python传参数:传值还是传址?
【2月更文挑战第18天】
281 6
Python函数参数传递:传值还是传引用
Python函数参数传递:传值还是传引用
77 0
【Python】传值与传址
【Python】传值与传址
102 0
Python 函数中,参数是传值,还是传引用?
Python 函数中,参数是传值,还是传引用?
153 0
Python 传值 or 传引用
python 不允许程序员选择采用传值还是传引用。
112 0
Python 高级编程与实战:深入理解性能优化与调试技巧
本文深入探讨了Python的性能优化与调试技巧,涵盖profiling、caching、Cython等优化工具,以及pdb、logging、assert等调试方法。通过实战项目,如优化斐波那契数列计算和调试Web应用,帮助读者掌握这些技术,提升编程效率。附有进一步学习资源,助力读者深入学习。
[oeasy]python081_ai编程最佳实践_ai辅助编程_提出要求_解决问题
本文介绍了如何利用AI辅助编程解决实际问题,以猫屎咖啡的购买为例,逐步实现将购买斤数换算成人民币金额的功能。文章强调了与AI协作时的三个要点:1) 去除无关信息,聚焦目标;2) 将复杂任务拆解为小步骤,逐步完成;3) 巩固已有成果后再推进。最终代码实现了输入验证、单位转换和价格计算,并保留两位小数。总结指出,在AI时代,人类负责明确目标、拆分任务和确认结果,AI则负责生成代码、解释含义和提供优化建议,编程不会被取代,而是会更广泛地融入各领域。
83 28
Python 高级编程与实战:深入理解数据科学与机器学习
本文深入探讨了Python在数据科学与机器学习中的应用,介绍了pandas、numpy、matplotlib等数据科学工具,以及scikit-learn、tensorflow、keras等机器学习库。通过实战项目,如数据可视化和鸢尾花数据集分类,帮助读者掌握这些技术。最后提供了进一步学习资源,助力提升Python编程技能。
|
1月前
|
[oeasy]python074_ai辅助编程_水果程序_fruits_apple_banana_加法_python之禅
本文回顾了从模块导入变量和函数的方法,并通过一个求和程序实例,讲解了Python中输入处理、类型转换及异常处理的应用。重点分析了“明了胜于晦涩”(Explicit is better than implicit)的Python之禅理念,强调代码应清晰明确。最后总结了加法运算程序的实现过程,并预告后续内容将深入探讨变量类型的隐式与显式问题。附有相关资源链接供进一步学习。
38 4
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等