【python基础】函数-值传递
为了更好的认识函数,我们还要研究值传递问题,再研究这个问题之前,我们已经知道了函数之间的值传递,是实参变量值传递给形参变量,然后让形参变量在函数内完成相应的功能。但是因为数据类型的不同,这里的值传递产生的对实参变量的效果是不同的
1.传递数据本质
参数传递之间传递的肯定是数据,而这种数据本质上是地址值。变量有四个要素:名、值、数据类型、地址值。每个变量在创建时都会在内存中开辟一定空间,该空间具有地址值,并在该地址里面存储数据,Python的变量存储的数据是地址值,该地址值所代表的是真实数据的地址值,而不是变量的地址值。
1.1不可变数据类型
我们之前介绍过数字、字符串、元组它是不可变的,就是说只要在内存中创建了该数据,那么它是不变的,创建了数字1,那么数字1是存在的,我们把变量进行运算操作,假设进行加法运算,让其加1,变为了2,那么这里是创建了一个数字2,数字2也是不可变的,原先的数字1还是存在的,只不过我们的变量中储存的数据是数字2的地址值了。

图中的0x-xx是地址假想值。
id函数在作用于变量时,其返回的是变量指向数据内容的地址值,编写程序如下所示:

参数之间数据的传递,就是将实参变量的值赋值给形参变量,这里我们说的实参变量的值就是实参数据的地址值,编写程序如下所示:

我们通过输出结果发现,num1、num2、num3所存储的地址值都是相同的,都为140716513424168,这说明他们都指向同一个数据,也就是数字1,但是经过运算后,num3所存储的地址值变化了,是因为产生了新数据,新数据的地址赋值给了num3,num3指向了数字2的地址
那么,经过sum函数后,因为num1、num2的地址是没有发生改变的,所以我们输出num1和num2它的结果还是1。
这里我们是用数字举例的,换成字符串、元组等都是同样的道理
1.2可变数据类型
不可变数据类型在内存中的表现:当不可变数据类型(数字、字符串、元组)的变量需要更新新值时,其创建一个新值,将旧值的地址更换为新值的地址,此时指向发生改变。
可变数据类型,我们目前了解的就是列表、字典,我们可以发现它们都不是一个简单的数据,而是一组相对复杂的数据集合,数据集合里面包含的数据类型是任意的,就相当于一个仓库,可变数据类型变量的数据值是仓库的地址,而我们所说的可变数据类型变量里面的数据更新新值时,不是仓库地址的改变,而是仓库内数据元素的改变。
所以,可变数据类型在内存中的表现:当可变数据类型(列表、字典)变量需要更新数据元素新值时,其创建一个数据元素新值,将新值的地址放进可变数据类型所指向的仓库里面,而不是改变可变数据类型变量存储的仓库的地址值,其逻辑如下图所示。

图中的0x-xx是地址假想值。
我们可以做下验证,编写程序如下所示:

通过输出结果我们发现,
1.在经过del_first函数之前,输出列表数据元素为[1,2,3,4]。在经过del_first函数之后,输出列表数据元素为[2,3,4]这说明改变了实参变量list所指向的地址中的内容,形象化理解,就是改变了仓库里面的内容。
2.在经过del_first函数之前,list变量所存储的地址值为2113656214912。经过del_first函数之后,list变量所存储的地址值仍为2113656214912。所以说明list变量经过函数操作后,没有改变其存储的地址值,形象化理解,就是没有改变仓库的地址
3.在经过del_first函数之前,列表数据元素0所存储的地址为140712759325480,列表数据元素1所存储的地址为140712759325512。在经过del_first函数之后,列表数据0所存储的地址为原先列表数据元素1存储的地址140712759325512,也就是经过删除第一个数据元素的操作后,所有数据元素都依次往前排列。形象化理解,就是把仓库中第一个位置的物品拿出来,然后把其他的物品依次往前挪一个位置。
这里我们是用列表举例的,换成字典等其他可变数据类型都是同样的道理
1.3总结
不可变数据类型的实参变量,经过函数操作之后,不会改变其原有内容
可变数据类型的实参变量,经过函数操作之后,会改变其原有内容
【python基础】函数-值传递的更多相关文章
- python基础——函数的参数
python基础——函数的参数 定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了.对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复 ...
- python基础—函数嵌套与闭包
python基础-函数嵌套与闭包 1.名称空间与作用域 1 名称空间分为: 1 内置名称空间 内置在解释器中的名称 2 全局名称空间 顶头写的名称 3 局部名称空间 2 找一个名称的查找顺序: ...
- Python基础-函数参数
Python基础-函数参数 写在前面 如非特别说明,下文均基于Python3 摘要 本文详细介绍了函数的各种形参类型,包括位置参数,默认参数值,关键字参数,任意参数列表,强制关键字参数:也介绍了调用函 ...
- python基础,函数,面向对象,模块练习
---恢复内容开始--- python基础,函数,面向对象,模块练习 1,简述python中基本数据类型中表示False的数据有哪些? # [] {} () None 0 2,位和字节的关系? # ...
- python基础—函数装饰器
python基础-函数装饰器 1.什么是装饰器 装饰器本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能. 装饰器的返回值是也是一个函数对象. 装饰器经常用于有切 ...
- 第三章:Python基础の函数和文件操作实战
本課主題 Set 集合和操作实战 函数介紹和操作实战 参数的深入介绍和操作实战 format 函数操作实战 lambda 表达式介绍 文件操作函数介紹和操作实战 本周作业 Set 集合和操作实战 Se ...
- Python基础-函数篇
本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 函数与函数式编程 1.面向对象: 华山派-- ...
- Python基础(函数,函数的定义,函数的调用,函数的参数,递归函数)
1.函数 我们知道圆的面积计算公式为: S = πr2 当我们知道半径r的值时,就可以根据公式计算出面积.假设我们需要计算3个不同大小的圆的面积: r1 = 12.34 r2 = 9.08 r3 = ...
- Python基础 --函数的参数
定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了.对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解 ...
- python中的值传递和引用传递
Python中的变量是没有类型的,我们可以把它看做一个(*void)类型的指针,变量是可以指向任何对象的,而对象才是有类型的. Python中的对象有可变对象(number,string,tuple等 ...
随机推荐
- [BUUCTF]Pwn刷题记录
本部分内容长期更新,不再创建新文章影响阅读 rip 根据IDA加载入main函数声明发现s数组距离rbp的距离为F,即为15,这里的运行环境是64位,所以应当将Caller's rbp的数据填满,在这 ...
- 重新编译Unity Mono遇到的坑,大坑,巨坑!!!
因为项目需要,要整一个DLL热更功能,本身也想对DLL进行加密,所以需要修改Mono的代码,并重新编译.参考了网上的教程后,决定在linux下做重编的工作. 然而在实际执行的时候,一开始就碰到了巨大的 ...
- IO流中「线程」模型总结
目录 一.基础简介 二.同步阻塞 1.模型图解 2.参考案例 三.同步非阻塞 1.模型图解 2.参考案例 四.异步非阻塞 1.模型图解 2.参考案例 五.Reactor模型 1.模型图解 1.1 Re ...
- [数据库]Oracle数据迁移至HIVE(待续)
step1 导出csv数据,并 call sql_to_csv('select * from BE_JJZKJCQKTJ', 'OUT_PATH', 'DA.BE_JJZKJCQKTJ.csv'); ...
- [Java SE]javac编译时编码错误
1 问题复现 Information:java: javacTask: 源发行版 8 需要目标发行版 1.8 Information:java: Errors occurred while compi ...
- ChatGPT4实现前一天
目录 提出需求 代码实现 需求分析 单元测试 等价类划分 决策表 软件测试作业,用ChatGPT4来帮个小忙,小划水,勿喷勿喷,近期有相关作业的同学看到我的文章,建议修改一下,别撞车了,哈哈哈~ 提出 ...
- 【LeetCode】232.使用栈模拟队列
使用栈模拟队列 请你仅使用两个栈实现先入先出队列.队列应当支持一般队列支持的所有操作(push.pop.peek.empty):实现 MyQueue 类: void push(int x) 将元素 ...
- Android Studio 样式和主题背景
样式和主题背景 转载自 Styles and Themes | Android Developers 借助 Android 中的样式和主题背景,您可以将应用设计的细节与界面的结构和行为分开,其 ...
- Docker构建镜像踩坑日记
从Github上拉取python项目后,运行dockerfile构建镜像失败,一步步查找原因 主要原因就是国内下载各种依赖超时,以下提供pip.apt.pipenv镜像解决方案 pip更换国内镜像 这 ...
- 为什么数据库project被做成了web开发啊啊——一个半小时实现增删查改
昨天晚上去小破站上找了一点点~~亿点点~~资料,仔细研究了一下我们项目说明文档里的restful框架,发现可以直接用django_restful_framework. 天大的好消息啊!今天下午有三个小 ...