Python 传值还是传引用

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

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

目录
相关文章
|
3月前
|
Python
Python传参数:传值还是传址?
【2月更文挑战第18天】
91 6
|
11月前
|
C++ Python
Python函数参数传递:传值还是传引用
Python函数参数传递:传值还是传引用
50 0
|
Python
【Python】传值与传址
【Python】传值与传址
72 0
|
存储 C++ Python
Python 函数中,参数是传值,还是传引用?
Python 函数中,参数是传值,还是传引用?
83 0
|
程序员 Python
Python 传值 or 传引用
python 不允许程序员选择采用传值还是传引用。
47 0
|
8天前
|
算法 程序员 开发工具
百万级Python讲师又一力作!Python编程轻松进阶,豆瓣评分8.1
在学习Python的旅程中你是否正在“绝望的沙漠”里徘徊? 学完基础教程的你,是否还在为选择什么学习资料犹豫不决,不知从何入手,提高自己?
百万级Python讲师又一力作!Python编程轻松进阶,豆瓣评分8.1
|
2天前
|
Shell 数据处理 C++
【震撼揭秘】Python正则VS Shell正则:一场跨越编程边界的史诗级对决!你绝不能错过的精彩较量,带你领略文本处理的极致魅力!
【8月更文挑战第19天】正则表达式是文本处理的强大工具,在Python与Shell中有广泛应用。两者虽语法各异,但仍共享许多基本元素,如`.`、`*`及`[]`等。Python通过`re`模块支持丰富的功能,如非捕获组及命名捕获组;而Shell则依赖`grep`、`sed`和`awk`等命令实现类似效果。尽管Python提供了更高级的特性和函数,Shell在处理文本文件方面仍有其独特优势。选择合适工具需根据具体需求和个人偏好决定。
|
6天前
|
算法 程序员 开发工具
百万级Python讲师又一力作!Python编程轻松进阶,豆瓣评分8.1
在学习Python的旅程中你是否正在“绝望的沙漠”里徘徊? 学完基础教程的你,是否还在为选择什么学习资料犹豫不决,不知从何入手,提高自己?
|
4天前
|
数据采集 存储 人工智能
掌握Python编程:从基础到进阶的实用指南
【8月更文挑战第17天】 本文旨在通过浅显易懂的语言和实际案例,为初学者和有一定基础的开发者提供一条清晰的Python学习路径。我们将从Python的基本语法入手,逐步深入到面向对象编程、数据科学应用及网络爬虫开发等高级主题。每个部分都配备了代码示例和实操建议,确保读者能够将理论知识转化为实际能力。无论你是编程新手,还是希望提升Python技能的开发者,这篇文章都将为你打开一扇通往高效编程世界的大门。
10 2