第8天,函数传参时,的内存图

可变/不可变类型在传参时的区别

**1. 不可变类型参数有:**

数值型(整数,浮点数,复数)
布尔值bool
None 空值
字符串str
元组tuple
固定集合frozenset
2. 可变类型参数有:
列表 list
字典 dict
集合 set
3. 传参说明:
不可变类型的数据传参时,函数内部不会改变原数据的值。
可变类型的数据传参时,函数内部可以改变原数据。

图1:定义函数,定义变量,向函数传递参数,预测执行结果
代码在图的左侧:
前三行:定义一个名为fun02的函数,它有两个形参p1,p2;函数体内是两个表达式.
第四五行:定义两个变量
第六行:调用函数,重点在这里,下面来模拟代码的运行过程
调用函数后,函数开辟了临时的"栈帧"来存储函数中的变量,p1指向了位置实参g01所指的对象"100";p2指向了位置实参g02所指的对象"[100]",注意,这里的g02是一个列表.
然后函数开始运行:p1 = 200,也就是给p1重新赋值了,它不再指向100,变成了200;  p2[0] = 200,这是将p2所指向的集合的第0个索引位置的元素,修改成了200,但是p2本身还是在指向原来的集合的,如图
最后执行完函数体后,临时的"栈帧"被释放,它内部的变量以及指向关系也随之消失.

所以,最后的结果:
g01,并未发生改变,还是指向100.
g02,它的指向没有发生改变,只是指向的这个列表内部发生了变化,所以它会跟着变化,变成了集合:"[200]"
函数运行1
图2:在函数内部修改字符串/列表/切片后,对函数外变量的影响
函数运行2
g01: 在函数内的p1被赋值为"孙悟空",函数运行完毕,随即被释放,所以g01不变
**g02:**原来是个列表,传递到函数内时,p2经由g02也指向了这个列表,然后p2被修改成指向另一个列表,但是,跟g01一样.运行完毕后也被释放,最终的值也不会变
**g03:**修改的是g03的整体切片,相当与是把这个列表内的所有东西换成了300,是在原列表的基础上进行修改的,所以函数运行完毕后,它的变化会保留下来.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值