【Python】函参传递的内存分析

函参传递的内存分析

1.代码

def fun(arg1,arg2):
    print("arg1",arg1,id(arg1)) # arg1 11 2532349706800
    print("arg2",arg2,id(arg2)) # arg2 [22, 33, 44] 2532351062720
    arg1=100
    arg2.append(10)
    print("arg1", arg1, id(arg1)) # arg1 100 2532349709648
    print("arg2", arg2, id(arg2)) # arg2 [22, 33, 44, 10] 2532351062720

n1 = 11
n2 = [22,33,44]
print("n1",n1,id(n1)) # n1 11 2532349706800
print("n2",n2,id(n2)) # n2 [22, 33, 44] 2532351062720
fun(n1,n2) # 位置实参,n1,n2为实参,arg1,arg2为形参,实参名称与形参名称可以不一致

print("n1",n1,id(n1)) # n1 11 2532349706800
print("n2",n2,id(n2)) # n2 [22, 33, 44, 10] 2532351062720
来源:https://www.bilibili.com/video/BV1wD4y1o7AS?p=89&share_source=copy_web&vd_source=e53630e98feb1478ab871b7157f4f523

2.问题

为什么n1在函参传递过程后值未发生改变,而n2在函参传递过程后列表发生了变化。

3.理解

1)不可变类型传递的只是n1的值,没有影响对象n1本身,所以n1的值不变。在函数内部修改n1的值(arg1=100),
则是新生成了一个n1的对象arg1(n1与arg1的id不同,说明不是同一个对象)

2)可变类型,是真真正正的将对象传递过去,在函数内部修改,在外部也会受到影响。在函参传递过程中,
n2传递到arg2内,而arg2在内部append了10,所以n2也受到影响以至于最后输出[22, 33, 44, 10]

4.补充

1)在python中,类型属于对象,变量是没有类型的。
例如a=‘python’中,对象‘python’是string类型,但变量a只是对象的引用

2)python中存在 可更改对象(mutable)与 不可更改对象(immutable),
可更改对象包括 列表,字典等;不可更改对象包括 数据类型、字符串、元组。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值