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语法很多不了解的地方。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JavaEdge

美团18春招编程笔试题赏析1 字符串距离2 数字字符

3338
来自专栏mathor

C++STL中vector使用策略(一)

1045
来自专栏WD学习记录

牛客网 数组中的逆序对

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的...

1263
来自专栏Jack-Cui

第七天、判断三角形的类型

    根据输入的三角形的三条边判断三角形的类型,并输出它的面积和类型。 C代码: /*第七天、判断三角形的类型*/ #include <stdio.h> ...

2190
来自专栏软件开发 -- 分享 互助 成长

使用数字进行字符遍历

有些时候使用数字进行遍历,然后将数字转化成需要的进制数,再将进制数对应成需要的字符是一种非常有效的方法。 如: 输入一个正整数X,在下面的等式左边的数字之间添加...

22610
来自专栏数据科学学习手札

(数据科学学习手札02)Python与R在循环语句与条件语句上的异同

循环是任何一种编程语言的基本设置,是进行批量操作的基础,而条件语句是进行分支运算的基础,Python与R有着各自不同的循环语句与条件语句语法,也存在着一些相同的...

2738
来自专栏深度学习之tensorflow实战篇

python高阶函数:map(f,[list]),reduce(f,[list],可选初始值),

map,reduce和filter三个函数在python3和python2中发生了较大的差异。具体请看文章后面部分。 1. python的map()函数 ...

3354
来自专栏大闲人柴毛毛

动态规划法(三)——最长公共子序列

问题描述 给定两个序列,求出它们的最长公共子序列。 如:序列X={a,b,c,b,d,a,b},Y={b,d,c,a,b,a},则X和Y的最长公共子...

3634
来自专栏数据结构与算法

P1062 数列

题目描述 给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是: 1,3,4,9,...

3027
来自专栏PHP在线

php面试题(二)

1 <?php echo count (false); $a = count ("567") + count(null) + count(false); ec...

4258

扫码关注云+社区

领取腾讯云代金券