函数的参数作为引用
文章目录
- 1. num,list ,tuple
- 2. list 作为默认值导致共享同一列表
- 3. 防御可变参数
- 4. 结论
1. num,list ,tuple
结论:num ,tuple 作为参数,自身不会因为函数的原因而改变,list 为可变量,会因为函数变而变。
- 测试
def f(a, b):a += breturn aif __name__ == "__main__":x = 1y = 2result = f(x, y)print("*"*40)print("num 数字作为参数")print(f"x= {x}")print(f"y= {y}")print(f"result={result}")print("*"*40,'\n')x1 = [1,2]y1 = [3,4]result1 = f(x1, y1)print("*"*40)print("list 数字作为参数")print(f"x1= {x1}")print(f"y1= {y1}")print(f"result1={result1}")print("*"*40,'\n')x2 = (1,2)y2 = (3,4)result2 = f(x2, y2)print("*"*40)print("tuple 数字作为参数")print(f"x2= {x2}")print(f"y2= {y2}")print(f"result2={result2}")print("*"*40)
- 结论:
****************************************
num 数字作为参数
x= 1
y= 2
result=3
**************************************** ****************************************
list 数字作为参数
x1= [1, 2, 3, 4]
y1= [3, 4]
result1=[1, 2, 3, 4]
**************************************** ****************************************
tuple 数字作为参数
x2= (1, 2)
y2= (3, 4)
result2=(1, 2, 3, 4)
2. list 作为默认值导致共享同一列表
没有指定初始乘客的HauntedBus实例会共享同一乘客列表
class HauntedBus:"""备受幽灵乘客折磨的校车"""# 默认值为list ,会导致新实例化的bus2 & bus3共享同一列表def __init__(self, passengers=[]):# 设置可变类型作为参数默认值self.passengers = passengersdef pick(self, name):self.passengers.append(name)def drop(self, name):try:self.passengers.remove(name)except ValueError as e:print("error for ", e)if __name__ == "__main__":bus1 = HauntedBus(['Alice', 'Bill'])print(f"bus1.passengers={bus1.passengers}")bus1.pick('Charlie')bus1.drop('Alice')print(f"bus1.passengers={bus1.passengers}")bus2 = HauntedBus()bus2.pick('Carrie')print(f"bus2.passengers={bus2.passengers}")bus3 = HauntedBus()print(f"bus3.passengers={bus3.passengers}")
- 结果
bus1.passengers=['Alice', 'Bill']
bus1.passengers=['Bill', 'Charlie']
bus2.passengers=['Carrie'] # bus2 和bus3 没有默认值的情况下共享同一列表
bus3.passengers=['Carrie']
3. 防御可变参数
- 缺点: 用list 作为形参,会改变实参的值
class TwilightBus:"""让乘客销声匿迹的校车"""def __init__(self, passengers=None):if passengers is None:self.passengers = []else:# 用 passengers 作为参数传入,会导致self.passengers,# passengers ,basketball_team,# 都为列表['sue', 'tina', 'maya', 'diana', 'pat'] 的别名,所以任一改变,# 均可改变['sue', 'tina', 'maya', 'diana', 'pat']的值self.passengers = passengersdef pick(self, name):self.passengers.append(name)def drop(self, name):try:self.passengers.remove(name)except ValueError as e:print("Error for ", e)if __name__ == "__main__":basketball_team = ['sue', 'tina', 'maya', 'diana', 'pat']bus = TwilightBus(basketball_team)print(f"before : basketball_team={basketball_team}")bus.drop('tina')bus.drop('jason')bus.drop('pat')print(f"after : basketball_team={basketball_team}")
- 结果:
before : basketball_team=['sue', 'tina', 'maya', 'diana', 'pat']
Error for list.remove(x): x not in list
# 列表在经过函数后居然发生变化
after : basketball_team=['sue', 'maya', 'diana']
- 方案:
应该把参数值的副本赋值给self.passengers,
错误:self.passengers = passengers
正确:self.passengers = list(passengers)
class TwilightBus:"""让乘客销声匿迹的校车"""def __init__(self, passengers=None):if passengers is None:self.passengers = []else:# 用 passengers 作为参数传入,会导致self.passengers,passengers ,basketball_team,# 都为列表['sue', 'tina', 'maya', 'diana', 'pat'] 的别名,所以任一改变,均可改变['sue', 'tina', 'maya', 'diana', 'pat']的值self.passengers = passengersdef pick(self, name):self.passengers.append(name)def drop(self, name):try:self.passengers.remove(name)except ValueError as e:print("Error for ", e)class OkBus:def __init__(self, passengers=None):if passengers is None:self.passengers = []else:# 创建 passengers 的副本,并且赋值给 self.passengers# 重点 list(passengers)!!!!!!!self.passengers = list(passengers)def pick(self, name):self.passengers.append(name)def drop(self, name):try:self.passengers.remove(name)except ValueError as e:print("Error for ", e)if __name__ == "__main__":basketball_team = ['sue', 'tina', 'maya', 'diana', 'pat']bus = TwilightBus(basketball_team)print("*"*40)print(f"before : basketball_team={basketball_team}")bus.drop('tina')bus.drop('jason')bus.drop('pat')print(f"after : basketball_team={basketball_team}")print("*"*40)basketball_teamok = ['sue', 'tina', 'maya', 'diana', 'pat']busok = OkBus(basketball_teamok)print(f"before : basketball_teamok={basketball_teamok}")busok.drop('tina')busok.drop('pat')print(f"after : basketball_teamok={basketball_teamok}")print("*"*40)
- 结果
****************************************
# self.passengers = passengers 的结果,会影响原来的参数列表 basketball_team
before : basketball_team=['sue', 'tina', 'maya', 'diana', 'pat']
Error for list.remove(x): x not in list
after : basketball_team=['sue', 'maya', 'diana']
****************************************
# self.passengers = list(passengers) 的结果,不影响 原来的参数列表 basketball_team
before : basketball_teamok=['sue', 'tina', 'maya', 'diana', 'pat']
after : basketball_teamok=['sue', 'tina', 'maya', 'diana', 'pat']
****************************************
4. 结论
当函数用参数时,尽量用不可变作为形参,比如数字,元组,如果用可变类型作为变量,会导致传入的值变化,为了解决这个问题,判断参数传入的是不是None,并且重新创建新的list
class Bus:def __init__(self,passengers=None):if passengers is None:self.passengers = []else:self.passengers = list(passengers)
相关文章:
函数的参数作为引用
文章目录 1. num,list ,tuple2. list 作为默认值导致共享同一列表3. 防御可变参数4. 结论 1. num,list ,tuple 结论:num ,tuple 作为参数,自身不会因为函数的原因而改变,list 为可变量,会因为函数变而变。 测试 def f(a, b):a …...
【文化课学习笔记】【化学】非金属及其化合物
【化学】必修一:非金属及其化合物 硅及其化合物 硅单质 物理性质 单晶硅的结构与金刚石类似,为正四面体的立体网状结构。晶体中每个硅原子与其他四个硅原子相连接。\(1\mathrm{mol}\) 硅单质还有 \(\mathrm{2N_A}\) 个 \(\mathrm{Si-Si}\) 键;…...
Unity进阶–通过PhotonServer实现联网登录注册功能(客户端)–PhotonServer(三)
文章目录 Unity进阶–通过PhotonServer实现联网登录注册功能(客户端)–PhotonServer(三)前情提要客户端部分 Unity进阶–通过PhotonServer实现联网登录注册功能(客户端)–PhotonServer(三) 前情提要 单例泛型类 using System.Collections; using System.Collections.Generic; …...
步步向前,曙光已现:百度的大模型之路
大模型,是今年全球科技界最火热,最耀眼的关键词。在几个月的狂飙突进中,全球主要科技公司纷纷加入了大模型领域。中国AI产业更是开启了被戏称为“百模大战”的盛况。 但喧嚣与热闹之后,新的问题也随之而来:大模型的力量…...
常见的 Python 错误及其解决方案
此文整理了一些常见的 Python 错误及其解决方案。 1、SyntaxError: invalid syntax 说明:无效的语法是最常见的错误之一,通常是由于编写代码时违反了 Python 的语法规则。可能的原因: 忘记在 if、while、for 等语句后写冒号,或者…...
文章评论以及回复评论邮件通知(Go 搭建 qiucode.cn 之八)
要说到评论。无疑是博客应用的灵魂所在了,它也正是站长与博友、博友与博友之间互相交流的桥梁,倘若少了它,博客应用将变得暗淡无关,索然无味,恍如一具躺在床榻上的植物人,终究是无法与周边人言语的。 也正是有了评论,站长在该博客应用所发表的博文,博友才得以通过评论,…...
java面试基础 -- ArrayList 和 LinkedList有什么区别, ArrayList和Vector呢?
目录 基本介绍 有什么不同?? ArrayList的扩容机制 ArrayLIst的基本使用 ArrayList和Vector 基本介绍 还记得我们的java集合框架吗, 我们来复习一下, 如图: 可以看出来 ArrayList和LinkedList 都是具体类, 他们都是接口List的实现类. 但是他们底层的逻辑是不同的, 相信…...
matlab 点云最小二乘拟合空间直线(方法一)
目录 一、算法原理1、空间直线2、最小二乘法拟合二、代码实现三、结果展示四、可视化参考本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、空间直线 x...
详解junit
目录 1.概述 2.断言 3.常用注解 3.1.Test 3.2.Before 3.3.After 3.4.BeforeClass 3.5.AfterClass 4.异常测试 5.超时测试 6.参数化测试 1.概述 什么是单元测试: 单元测试,是针对最小的功能单元编写测试代码,在JAVA中最小的功能单…...
Nginx的安装及负载均衡搭建
一.Nginx的安装 1)准备安装环境 yum install -y make gcc gcc-c pcre-devel pcre zlib zlib-devel openssl openssl-develPERE PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库。 nginx的http模块使用pcre来解…...
JVM学习笔记(一)
1. JVM快速入门 从面试开始: 请谈谈你对JVM 的理解?java8 的虚拟机有什么更新? 什么是OOM ?什么是StackOverflowError?有哪些方法分析? JVM 的常用参数调优你知道哪些? 内存快照抓取和MAT分…...
fastjson 序列化问题:Comparison method violates its general contract
fastjson 序列化问题:Comparison method violates its general contract 问题重现 今天在测试接口的时候,调用了Mybatis Plus 分页查询的接口,然后将查询的结果转换成 Json字符串的形式,结果报了这个错误: java.lang.…...
Angular安全专辑之二——‘unsafe-eval’不是以下内容安全策略中允许的脚本源
一:错误出现 这个错误的意思是,拒绝将字符串评估为 JavaScript,因为‘unsafe-eval’不是以下内容安全策略中允许的脚本源。 二:错误场景 testEval() {const data eval("var sum2 new Function(a, b, return a b); sum2(em…...
十一、Linux用户及用户组的权限信息如何查看?如何修改?什么是权限的数字序号?
目录: 1、认知权限信息 2、rwx? (1)总括: (2)r权限: (3)w权限: (4)x权限: 3、修改权限 (1&a…...
ahooks.js:一款强大的React Hooks库及其API使用教程(二)
一、ahooks.js简介二、ahooks.js安装三、继续ahooks.js API的介绍与使用教程21. useLocalStorageState22. useSessionStorageState23. useClickAway24. usePersistFn25. useCreation26. useFullscreen27. useInViewport28. useInfiniteScroll29. usePagination30. useDynamicLi…...
ARM 配置晶振频率
文章目录 前言串口乱码问题定位内核修改晶振频率uboot 修改晶振频率番外篇 前言 上篇文章《ARM DIY 硬件调试》介绍了 DIY ARM 板的基础硬件焊接,包括电源、SOC、SD 卡座等,板子已经可以跑起来了。 但是发现串口乱码,今天就来解决串口乱码问…...
最强自动化测试框架Playwright(37)-网络
介绍 Playwright 提供 API 来监控和修改浏览器网络流量,包括 HTTP 和 HTTPS。页面执行的任何请求,包括 XHR 和获取请求,都可以被跟踪、修改和处理。 模拟接口 查看我们的 API 模拟指南,了解有关如何 模拟 API 请求,…...
Ant Design Pro 前端脚手架 配置混合导航
Ant Design Pro脚手架 点击查看阅读 混合导航: 顶部导航和侧边栏导航实现联动效果,点击不同的顶部导航按钮会显示对应的子菜单项。 实现点: 1. 路由的配置 菜单展示 我们可以在 route 中进行 menu 相关配置,来决定当前路由是否…...
tcl学习之路(五)(Vivado时序约束)
1.主时钟约束 主时钟通常是FPGA器件外部的板机时钟或FPGA的高速收发器输出数据的同步恢复时钟信号等。下面这句语法大家一定不会陌生。该语句用于对主时钟的名称、周期、占空比以及对应物理引脚进行约束。 create_clock -name <clock_name> -periood <period> -wa…...
Hlang-中英双语言编程语言使用手册
文章目录 介绍Hlang基本使用下载配置环境变量特性中文关键字支持中文符号混合编程中文错误提示终端多行输入基本数据类型整数浮点数列表字符串基本操作变量定义逻辑判断基本运算条件判断循环函数介绍 Hlang是一款基于Python编写的支持中英文混合编程的动态语言。其简单易上手,…...
黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...
负载均衡器》》LVS、Nginx、HAproxy 区别
虚拟主机 先4,后7...
C# WPF 左右布局实现学习笔记(1)
开发流程视频: https://www.youtube.com/watch?vCkHyDYeImjY&ab_channelC%23DesignPro Git源码: GitHub - CSharpDesignPro/Page-Navigation-using-MVVM: WPF - Page Navigation using MVVM 1. 新建工程 新建WPF应用(.NET Framework) 2.…...
多模态学习路线(2)——DL基础系列
目录 前言 一、归一化 1. Layer Normalization (LN) 2. Batch Normalization (BN) 3. Instance Normalization (IN) 4. Group Normalization (GN) 5. Root Mean Square Normalization(RMSNorm) 二、激活函数 1. Sigmoid激活函数(二分类&…...
XXE漏洞知识
目录 1.XXE简介与危害 XML概念 XML与HTML的区别 1.pom.xml 主要作用 2.web.xml 3.mybatis 2.XXE概念与危害 案例:文件读取(需要Apache >5.4版本) 案例:内网探测(鸡肋) 案例:执行命…...
