Skip to content

Latest commit

 

History

History
187 lines (114 loc) · 5.44 KB

189-531675-实参_arguement_为容器类型.sy.md

File metadata and controls

187 lines (114 loc) · 5.44 KB
show version enable_checker
step
1.0
true

函数

回忆

  • 上次我们分析了函数中参数赋值的过程
    • 在调用参数的时候
    • 完成了一个赋值的过程
    • 是把实参(arguement)赋给形参(parameter)的过程
    • 赋值还是比较麻烦的
  • 如果参数是一个容器又会如何呢?

构造

图片描述

  • 其中变量的前缀l
    • 代表变量的类型是一个列表(list)
  • 运行结果如下

图片描述

过程1

图片描述

图片描述

  • 第7行. 在主程序中
    • before test()的时候
    • 系统已经完成了对 l_my_temp 的赋值
      • 类型是一个list型的变量
      • 指向地址尾号944

图片描述

进入test后

图片描述

图片描述

  • 第2行 进入test()后
    • 完成了一个参数赋值的过程
    • temperature 依旧是指向尾号944内存地址的list类型变量

图片描述

  • 注意这个时候
    • 主函数和test函数中的列表指向同一个地址

修改后

图片描述

图片描述

  • 第3行 temperature重新赋值
    • 函数内的temperature被重新赋值
    • 指向了一个新的列表,地址尾号560
    • 主程序中的 my_temp 依然是指向944

图片描述

最终

图片描述

图片描述

  • 第9行 跳出函数调用 回到主程序
    • 主函数中的 my_temp 依然是指向768
  • 可以看到外面列表的地址始终没有变
  • 如果我想在函数内改变外面主函数中的列表有可能么?

图片描述

修改容器中的元素

图片描述

  • 修改了容器中第0个元素
  • 结果会如何呢?

图片描述

  • 列表的地址始终没有变
  • 但是列表中第0个元素真的被修改了
  • 这如何理解呢?

继续构造

图片描述

  • 这次我们来看看列表中第1个元素的地址

图片描述

  • 列表的地址始终没有变
  • 但是列表第0个元素在函数中被修改了
  • 流程大概是这样的

流程

图片描述

  • 这次我们来看看列表中第1个元素的地址

图片描述

  • 列表初始化

图片描述

参数赋值后

图片描述

图片描述

  • 函数参数赋值后

图片描述

修改第0个元素

图片描述

图片描述

  • 修改第0个元素

图片描述

  • 其他容器也是如此么?

元组

  • 把列表改成元组

图片描述

  • 结果

图片描述

  • 元组的元素是不可变的
  • 所以出现了TypeError
    • 元组对象不支持元组项元素的重新赋值
  • 如果不知改变元组的第1个元素
  • 而是直接指向新元组呢?

参数赋值

图片描述

  • 函数体内会指向一个新元组
  • 出了函数并不影响主程序中的元组地址

图片描述

总结

  • 我们这次拿容器变量做了函数的参数
  • 函数调用的时候也会有一个参数赋值的过程
  • 只不过这次赋值的是容器变量
    • 容器变量的地址在函数调用中的改变
      • 不影响外部主程序中的容器变量地址
    • 容器变量的元素的改变
      • 确实会影响到外部主程序中的容器变量
      • 因为容器地址没改
      • 这个地址指向的元素的修改就是会影响到主程序的容器变量

图片描述

  • 函数里面使用直接使用my_temp么?
    • 可以的话就不用传参数了?🤔
  • 我们下次再说👋