白白白白丶白 发表于 2020-7-7 14:16:07

函数

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

请问这句话怎么理解?找半天没找到相关例子。

Twilight6 发表于 2020-7-7 14:18:37



这个例子可以理解不:


def func(ls):
    for i in range(len(ls)):
      ls = i# 对应位置重新赋值,改变容器内的值


temp =
func(temp)
print(temp)# 打印发现 全局变量的 temp 列表也发生了改变

Twilight6 发表于 2020-7-7 14:21:05



这里再举个例子,当传入的不是容器类型的值的时候:


def func(ls):
    for i in range(100):
      ls += i# 对传入的参数进行改变


temp = 5
func(temp)
print(temp)   # 打印发现,结果还是 5

heidern0612 发表于 2020-7-7 14:27:19

本帖最后由 heidern0612 于 2020-7-7 14:29 编辑

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

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

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

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

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

这种在实际应用上,可以参考一个全局变量的变化,比如说装饰器验证登录状态,一般可以用这种列表去做。
页: [1]
查看完整版本: 函数