【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等 ...
随机推荐
- Stanford CS 144, Lab 0: networking warmup 实验
Stanford CS 144, Lab 0: networking warmup Finish Stanford CS144 lab0 and pass the test. 2023/03/29 - ...
- vue拖拽排序插件vuedraggable的使用 附原生使用方法
Vue中使用 先下载依赖: npm install vuedraggable -S 项目中引入 import draggable from 'vuedraggable' 注册 components: ...
- AndroidBanner - ViewPager 03
AndroidBanner - ViewPager 03 上一篇文章,描述了如何实现自动轮播的,以及手指触摸的时候停止轮播,抬起继续轮播,其实还遗留了一些问题: 当banner不可见的时候,也需要停止 ...
- 列表、sort、reverse、元组、字典、
1.列表是一种有序可变的容器.通过[]来标识 1)定义一个空列表list = [] 2.列表的添加 1)末尾添加append() list = ['张三',,'王五'] list.append('刘六 ...
- Java学习笔记05
1. 方法概述 概念 方法(method)是程序中最小的执行单元. 注意: 方法必须先创建才可以使用,该过程称为方法的定义. 方法创建后并不是直接可以运行的,进行方法的调用才会执行. 2. 方法的 ...
- If选择语句的用法
今天我们学习下If判断语句. 首先了解下它有几种用法: If单选择语句 If双选择语句 If多选择语句 我们一个一个用,每一个用法都给一个运用的过程演练一下. If单选择语句:我们很多需要判断一个东西 ...
- JavaScript基础语法-变量
JavaScript JavaScript - 变量 1. 概念 变量是用于存放数据的容器 通过变量名可以获取数据 并且数据是可修改的 2. 使用 声明变量 只声明不赋值 直接调用 程序会输出unde ...
- P7603 [THUPC2021] 鬼街(减半警报器模板)
P7603 [THUPC2021] 鬼街(减半警报器模板) 前言 这是一个由 lxl 大佬提出的神奇 trick,第一次省选集训的时候有点颓,听完了没写.刚好明天又要讲这个不如写篇题解. 还是,我太弱 ...
- \n 和 std::endl 的区别
std::cout << std::endl; 等价于 std::cout << '\n' << std::flush; 除了写入换行符,std::endl 还会刷 ...
- 【深入浅出 Yarn 架构与实现】6-3 NodeManager 分布式缓存
不要跳过这部分知识,对了解 NodeManager 本地目录结构,和熟悉 Container 启动流程有帮助. 一.分布式缓存介绍 主要作用就是将用户应用程序执行时,所需的外部文件资源下载缓存到各个节 ...