Skip to content

Latest commit

 

History

History
211 lines (134 loc) · 5.4 KB

File metadata and controls

211 lines (134 loc) · 5.4 KB
Error in user YAML: (<unknown>): could not find expected ':' while scanning a simple key at line 3 column 1
---
- oeasy Python 0208
- 这是 oeasy 系统化 Python 教程,从基础一步步讲,扎实、完整、不跳步。愿意花时间学,就能真正学会。
本教程同步发布在: 

     个人网站: `https://oeasy.org` 
     蓝桥云课: `https://www.lanqiao.cn/courses/3584` 
     GitHub: `https://github.com/overmind1980/oeasy-python-tutorial` 
     Gitee: `https://gitee.com/overmind1980/oeasypython` 
---

函数

回忆

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

构造

  • 其中变量的前缀l
    • 代表变量的类型是一个列表(list)
def test(l_temp):
    print("l_temp in test()", l_temp, ":", type(l_temp), "@", id(l_temp))
    l_temp = [35, 36, 37]
    print("l_temp in test()", l_temp, ":", type(l_temp), "@", id(l_temp))

l_my_temp = [35, 36, 37]
print("l_my_temp before test", l_my_temp, ":", type(l_my_temp), "@", id(l_my_temp))
test(l_my_temp)
print("l_my_temp after test ", l_my_temp, ":", type(l_my_temp), "@", id(l_my_temp))
  • 运行结果如下

图片描述

过程1

  • 运行结果
    • 可能数字 不一样

图片描述

  • 我们主要观察变化的规律

图片描述

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

图片描述

进入test后

图片描述

图片描述

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

图片描述

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

修改后

图片描述

图片描述

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

图片描述

最终

图片描述

图片描述

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

图片描述

修改容器中的元素

图片描述

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

图片描述

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

继续构造

图片描述

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

图片描述

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

流程

图片描述

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

图片描述

  • 列表初始化

图片描述

参数赋值后

图片描述

图片描述

  • 函数参数赋值后

图片描述

修改第0个元素

图片描述

图片描述

  • 修改第0个元素

图片描述

  • 其他容器也是如此么?

元组

  • 把列表改成元组

图片描述

  • 结果

图片描述

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

参数赋值

图片描述

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

图片描述

总结

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

图片描述

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

  • 本文来自 oeasy Python 系统教程。
  • 想完整、扎实学 Python,
  • 搜索 oeasy 即可。