当前位置: 首页 > news >正文

函数的参数作为引用

文章目录

  • 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}\) 键&#xff1b…...

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 请求&#xff0c…...

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编写的支持中英文混合编程的动态语言。其简单易上手,…...

OpenRocket:重新定义模型火箭设计与仿真的开源力量

OpenRocket&#xff1a;重新定义模型火箭设计与仿真的开源力量 【免费下载链接】openrocket Model-rocketry aerodynamics and trajectory simulation software 项目地址: https://gitcode.com/GitHub_Trending/op/openrocket 核心价值&#xff1a;破解模型火箭开发的效…...

别再用yield了!FastAPI 2.0官方弃用警告下的流式响应新范式(含ASGI StreamingResponse + async iterator最佳实践)

第一章&#xff1a;FastAPI 2.0流式响应弃用背景与演进动因FastAPI 2.0 将 StreamingResponse 的默认行为从“自动分块传输”转向显式、可控的流式语义&#xff0c;其核心动因源于对 HTTP/1.1 分块编码&#xff08;Chunked Transfer Encoding&#xff09;与现代客户端&#xff…...

5分钟搞定OpenClaw飞书接入:Qwen3.5-9B对话机器人配置

5分钟搞定OpenClaw飞书接入&#xff1a;Qwen3.5-9B对话机器人配置 1. 为什么选择OpenClaw飞书Qwen3.5-9B组合 上周我在整理团队周报时&#xff0c;突然意识到一个痛点&#xff1a;每次都要反复切换浏览器、文档和聊天工具&#xff0c;手动复制粘贴信息。这种机械操作不仅浪费…...

塑胶件防裂实践:3D检测亲测有效

行业痛点分析在精密制造领域&#xff0c;塑胶件开裂是长期困扰工程师的顽疾。传统检测手段&#xff0c;如卡尺、三坐标测量机&#xff08;CMM&#xff09;或二维影像测量&#xff0c;存在明显局限。它们难以对复杂曲面、内部应力集中区域进行非接触式、全尺寸的量化评估&#x…...

2026年,如何甄选一家真正靠谱的圆盘刀片工厂?

在冶金、包装、印刷、食品等制造业的精密加工环节&#xff0c;圆盘刀片&#xff08;也称圆刀片&#xff09;是决定裁切精度、效率与成本的核心耗材。随着2026年制造业对智能化、精细化需求的进一步提升&#xff0c;选择一家技术过硬、服务可靠的刀片供应商&#xff0c;已成为企…...

【北约】认知雷达信号处理 Cognitive Radar Signal Processing

本文仅供学习使用如有侵权&#xff0c;请联系本人删除 This article is for educational purposes only. If there is any copyright infringement, please contact me to have it removed....

Python张量框架选型不是技术问题,而是组织问题:CTO必须在立项前确认的5个战略问题(含人才储备周期、长期维护成本、专利风险审计清单)

第一章&#xff1a;Python张量框架选型不是技术问题&#xff0c;而是组织问题当团队在 PyTorch、TensorFlow 和 JAX 之间反复争论“哪个性能更好”或“哪个 API 更优雅”时&#xff0c;往往已陷入技术决定论的误区。真正制约张量框架落地效果的&#xff0c;是组织内部的协同惯性…...

STM32串口通信实战:从零配置USART到数据收发(附代码)

STM32串口通信实战&#xff1a;从零配置USART到数据收发&#xff08;附代码&#xff09; 第一次接触STM32的串口通信时&#xff0c;我被各种术语搞得晕头转向——波特率、数据位、停止位、校验位...更别提那些看起来像天书一样的寄存器配置了。直到在项目中被逼着用USART和传感…...

Apache Weex UI手势操作组件:滑动删除与拖拽交互终极指南

Apache Weex UI手势操作组件&#xff1a;滑动删除与拖拽交互终极指南 Apache Weex UI 是一个基于 Vue.js 的跨平台 UI 框架&#xff0c;专门用于构建高性能移动应用。其中&#xff0c;手势操作组件是提升用户体验的关键功能&#xff0c;让应用交互更加自然流畅。&#x1f60a; …...

ClearerVoice-Studio语音处理效率实测:1分钟音频平均处理耗时18秒

ClearerVoice-Studio语音处理效率实测&#xff1a;1分钟音频平均处理耗时18秒 1. 测试背景与工具介绍 ClearerVoice-Studio是一个开箱即用的语音处理工具包&#xff0c;集成了多种先进的AI语音处理功能。这个工具最大的特点就是简单易用&#xff0c;不需要用户具备深度学习背…...