鱼C论坛

 找回密码
 立即注册
查看: 1518|回复: 3

[已解决]函数

[复制链接]
发表于 2020-7-7 14:16:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
函数的形参在函数中修改了值时,并不影响调用方本身的数据,但如果形参是一个可变类型的容器,在函数中修改了容器中的元素,则该修改会影响到调用方的数据;

请问这句话怎么理解?找半天没找到相关例子。
最佳答案
2020-7-7 14:27:19
本帖最后由 heidern0612 于 2020-7-7 14:29 编辑

关键是这个可变类型的容器,一般情况下,可变类型的容器指的就是列表、字典一类包含数据段的容器。

这种容器本身占一个堆位,内容同样也占一个堆位。

在你定义函数的时候,如果你修改了容器元素,它的索引是会随着你函数调用变动而变动的。

也就是说,你修改可变类型容器,即使它在函数内部只是个局部变量,因为它索引的栈位不变,其实还是相当于修改了它自己。

上面说的有点迷糊,一般情况下,可变类型容器在实际应用中不存在什么局部变量、全局变量,只要是修改了它索引的栈区,那就所有指向同一栈区的内容都会跟着变化。

这种在实际应用上,可以参考一个全局变量的变化,比如说装饰器验证登录状态,一般可以用这种列表去做。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-7 14:18:37 | 显示全部楼层


这个例子可以理解不:
def func(ls):
    for i in range(len(ls)):  
        ls[i] = i  # 对应位置重新赋值,改变容器内的值


temp = [5,5,5,5,5]
func(temp)
print(temp)  # 打印发现 全局变量的 temp 列表也发生了改变
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-7 14:21:05 | 显示全部楼层


这里再举个例子,当传入的不是容器类型的值的时候:
def func(ls):
    for i in range(100):
        ls += i  # 对传入的参数进行改变


temp = 5
func(temp)
print(temp)   # 打印发现,结果还是 5 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-7 14:27:19 | 显示全部楼层    本楼为最佳答案   
本帖最后由 heidern0612 于 2020-7-7 14:29 编辑

关键是这个可变类型的容器,一般情况下,可变类型的容器指的就是列表、字典一类包含数据段的容器。

这种容器本身占一个堆位,内容同样也占一个堆位。

在你定义函数的时候,如果你修改了容器元素,它的索引是会随着你函数调用变动而变动的。

也就是说,你修改可变类型容器,即使它在函数内部只是个局部变量,因为它索引的栈位不变,其实还是相当于修改了它自己。

上面说的有点迷糊,一般情况下,可变类型容器在实际应用中不存在什么局部变量、全局变量,只要是修改了它索引的栈区,那就所有指向同一栈区的内容都会跟着变化。

这种在实际应用上,可以参考一个全局变量的变化,比如说装饰器验证登录状态,一般可以用这种列表去做。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-20 03:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表