python总结——函数参数传递

目录

1、参数传递的本质        

2、参数的分类

3、代码演示及分析

3.1 传递可变对象

3.2 传递不可变对象

3.3 传递不可变对象包含可变对象


1、参数传递的本质
        

        函数参数传递本质上是参实到形参的赋值操作。由于Python一切皆对象,所以python中的赋值传递都是“引用传递”,而不是“值传递”。

2、参数的分类

        具体操作可以分两类:可变对象和不可变对象。
可变对象:对可变对象写操作,直接作用在对象本身。
不可变对象:对不可变对象写操作,会产生新的“对象空间”来写操作,达到值传递的效果,但不是真正的值传递。
可变对象:列表,字典,集合,自定义对象等
不可变对象:数字、字符串、元组,函数等

3、代码演示及分析

3.1 传递可变对象

# 传可变对象
def test01(m):  
    print("m的地址:", id(m))  # 变量m和可变对象同地址
    m.append(30)
    print("m的值:", m)        # [10, 20, 30]



if __name__ == "__main__":
    print("**************传递参数为可变对象**************")
    a = [10, 20]  # 可变对象列表
    print("a的地址:", id(a))
    print("a的值:", a)
    print("**************")
    test01(a)  # 向函数传可变对象
    print("a的地址:", id(a))
    print("a的值:", a)  # a的值: [10, 20, 30]



**************传递参数为可变对象**************
a的地址: 1819302753216
a的值: [10, 20]
**************
m的地址: 1819302753216
m的值: [10, 20, 30]
a的地址: 1819302753216
a的值: [10, 20, 30]

       在函数内对m做添加数据操作,a的内容也发生了改变。说明当传递可变对象时,写操作就是作用在对象本身。同时观看变量a和m的地址也可以看出二者都指向同一块内容。

3.2 传递不可变对象

# 传不可变对象
def test02(m):  
    print("m的地址:", id(m))  # 变量m和不可变对象同地址
    print("m的值:", m)
    m = m + 30                # 不可变对象无法进行修改操作,因此会生成新的对象m来操作。
    print("m的地址:", id(m))  # 此处变量m的地址已经改变
    print("m的值:", m)

if __name__=="__main__"
    print("**************传递参数为不可变对象**************")
    n = 100  # 不可变对象数字
    print("n的地址:", id(n))
    print("n的值:", n)
    print("**************")
    test02(n)  # 向函数传不可变对象
    print("n的地址:", id(n))
    print("n的值:", n)  # n = 100



**************传递参数为不可变对象**************
n的地址: 140722447790992
n的值: 100
**************
m的地址: 140722447790992
m的值: 100
m的地址: 140722447791952
m的值: 130
n的地址: 140722447790992
n的值: 100

        在函数内对m做修改操作,a的内容并没有发生改变。说明当传递不可变对象时,写操作没有作用在对象本身,而是在函数内部新开辟了空间。通过m的地址可发现在操作 m=m+30 指令前后m的地址已经改变。

3.3 传递不可变对象包含可变对象

# 不可变对象元组含列表
def test03(m):  
    print("m:", id(m))  # 变量m和不可变对象同地址
    m[2][0] = 888
    print(“m的值:”,m)
    print("m的地址:", id(m))


if __name__ == "__main__":    
   
    print("**************传递参数为不可变对象(内部含可变对象)**************")
    a = (10, 20, [5, 6])  # 不可变对象元组含列表
    print("a的地址:", id(a))
    print("a的值:", a)
    print("**************")
    test03(a)  # 向函数传不可变对象
    print("a的地址:", id(a))
    print("a的值:", a)



**************传递参数为不可变对象(内部含可变对象)**************
a的地址: 1970610918784
a的值: (10, 20, [5, 6])
**************
m的地址: 1970610918784
m的值: (10, 20, [888, 6])
m的地址: 1970610918784
a的地址: 1970610918784
a的值: (10, 20, [888, 6])

        在函数内对m做修改操作,a的内容发生改变。说明当传递不可变对象(包含可变对象)时,写操作作用在对象本身。

总结:当参数有可变对象时,就作用在可变对象本身。没有可变对象时,则会开辟新空间。

个人总结,不对之处欢迎指出

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于Python的计算思维训练主要涉及到函数的概念。函数Python中的基本编程结构,通过函数可以将一系列操作封装起来,提高代码的复用性和可维护性。 首先,函数的定义和调用是计算思维中重要的一部分。学习者需要理解如何使用def关键字定义函数,并且学会传入参数和返回数值。这能够帮助他们将复杂的问题拆分成更小的部分,然后再分别解决。 其次,函数参数和返回值的运用是培养计算思维的有效途径。学习者需要理解函数参数可以是任意类型的数据,也可以是默认值,还可以是可变数量的参数。同时,他们需要掌握函数可以返回单个数值、多个数值或者其他函数的能力。 此外,函数的嵌套和递归是培养计算思维的重要方法。学习者需要了解函数可以在其内部调用其他函数,从而实现更复杂的功能。而递归则可以帮助他们理解问题的分治和循环求解策略。 最后,函数的高阶用法和闭包也是培养计算思维的关键。学习者需要明白函数可以作为参数传递给其他函数,也可以作为返回值被另一个函数使用。此外,他们还需要掌握闭包的概念和运用,以便更好地理解函数的作用域和生命周期。 通过学习和实践以上内容,学习者不仅可以掌握Python函数的用法,还可以培养出较强的计算思维能力,从而更好地应对复杂的问题和挑战。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值