show | version | enable_checker |
---|---|---|
step |
1.0 |
true |
- 上次我们分析了函数中参数赋值的过程
- 在调用参数的时候
- 完成了一个赋值的过程
- 是把实参(arguement)赋给形参(parameter)的过程
- 赋值还是比较麻烦的
- 如果参数是一个容器又会如何呢?
- 其中变量的前缀l
- 代表变量的类型是一个列表(list)
- 运行结果如下
- 第7行. 在主程序中
- before test()的时候
- 系统已经完成了对
l_my_temp
的赋值- 类型是一个list型的变量
- 指向地址尾号944
- 第2行 进入test()后
- 完成了一个参数赋值的过程
- temperature 依旧是指向尾号944内存地址的list类型变量
- 注意这个时候
- 主函数和test函数中的列表指向同一个地址
- 第3行 temperature重新赋值
- 函数内的temperature被重新赋值
- 指向了一个新的列表,地址尾号560
- 主程序中的 my_temp 依然是指向944
- 第9行 跳出函数调用 回到主程序
- 主函数中的 my_temp 依然是指向768
- 可以看到外面列表的地址始终没有变
- 如果我想在函数内改变外面主函数中的列表有可能么?
- 修改了容器中第0个元素
- 结果会如何呢?
- 列表的地址始终没有变
- 但是列表中第0个元素真的被修改了
- 这如何理解呢?
- 这次我们来看看列表中第1个元素的地址
- 列表的地址始终没有变
- 但是列表第0个元素在函数中被修改了
- 流程大概是这样的
- 这次我们来看看列表中第1个元素的地址
- 列表初始化
- 函数参数赋值后
- 修改第0个元素
- 其他容器也是如此么?
- 把列表改成元组
- 结果
- 元组的元素是不可变的
- 所以出现了TypeError
- 元组对象不支持元组项元素的重新赋值
- 如果不知改变元组的第1个元素
- 而是直接指向新元组呢?
- 函数体内会指向一个新元组
- 出了函数并不影响主程序中的元组地址
- 我们这次拿容器变量做了函数的参数
- 函数调用的时候也会有一个参数赋值的过程
- 只不过这次赋值的是容器变量
- 容器变量的地址在函数调用中的改变
- 不影响外部主程序中的容器变量地址
- 容器变量的元素的改变
- 确实会影响到外部主程序中的容器变量
- 因为容器地址没改
- 这个地址指向的元素的修改就是会影响到主程序的容器变量
- 容器变量的地址在函数调用中的改变
- 函数里面使用直接使用my_temp么?
- 可以的话就不用传参数了?🤔
- 我们下次再说👋