尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
在 Python 中,函数参数传递是编程的核心基础。Python 的参数传递机制与其他语言(如 C/C++)有所不同
在 Python 中函数参数传递是编程的核心基础。Python 的参数传递机制与其他语言如 C/C有所不同其本质是**“对象引用传递”**Call by Sharing即传递的是对象引用的拷贝而非对象本身或单纯的引用。为了让你全面掌握这一技术本文将从参数传递的底层机制、多种传参形式、参数定义规范以及命令行参数传递等维度进行深度解析并辅以详尽的代码案例。一、 Python 参数传递的底层机制在 Python 中一切皆对象。变量本质上是指向对象的指针。因此函数参数传递传递的是变量的值也就是对象在内存中的地址。这种机制在实际表现上取决于对象的可变性不可变对象如 int, float, str, tuple在函数内部对参数的修改如赋值、运算会创建新对象并重新绑定局部变量不会影响外部原对象。这在行为上类似于 C 语言的“值传递”。可变对象如 list, dict, set在函数内部通过原地操作如append,update修改对象内容会直接影响外部原对象。这在行为上类似于 C 语言的“引用传递”。# 1. 不可变对象示例defchange_immutable(val):val100# 重新赋值创建新对象不影响外部num1change_immutable(num)print(num)# 输出: 1# 2. 可变对象示例defchange_mutable(lst):lst.append(100)# 原地修改影响外部原对象my_list[0]change_mutable(my_list)print(my_list)# 输出: [0, 100]二、 五种基础传参形式Python 提供了极其灵活的传参方式主要包括以下五种1. 位置参数Positional Arguments最基础的传参方式实参的顺序和数量必须与形参一一对应。defintroduce(name,age):print(f姓名:{name}, 年龄:{age})introduce(张三,25)# 正确# introduce(张三) # 报错缺少参数2. 关键字参数Keyword Arguments通过参数名值的形式传递无需按顺序代码可读性更强。注意位置参数必须放在关键字参数前面。defintroduce(name,age):print(f姓名:{name}, 年龄:{age})introduce(age25,name张三)# 顺序随意introduce(张三,age25)# 混合使用位置在前关键字在后# introduce(name张三, 25) # 报错关键字参数不能在位置参数前3. 默认参数Default Parameters定义时指定默认值调用时可省略。默认参数必须位于非默认参数之后。⚠️经典大坑默认参数千万不要使用可变对象如 list, dict。因为默认值只在函数定义时计算一次多次调用会共享同一个对象导致意外累加。正确做法是使用None并在函数内部初始化。# ❌ 错误示范defbad_add_item(item,lst[]):lst.append(item)returnlstprint(bad_add_item(1))# [1]print(bad_add_item(2))# [1, 2] 意外累加# ✅ 正确示范defgood_add_item(item,lstNone):iflstisNone:lst[]lst.append(item)returnlstprint(good_add_item(1))# [1]print(good_add_item(2))# [2] 符合预期4. 可变位置参数*args使用单星号*接收任意数量的位置参数并将其打包成一个元组tuple。defcalc_sum(*nums):print(f收到的参数类型:{type(nums)})# class tuplereturnsum(nums)print(calc_sum(1,2,3))# 输出: 6print(calc_sum(10,20,30,40))# 输出: 1005. 可变关键字参数**kwargs使用双星号**接收任意数量的关键字参数并将其打包成一个字典dict。defshow_profile(**info):print(f收到的参数类型:{type(info)})# class dictforkey,valueininfo.items():print(f{key}:{value})show_profile(name李四,age30,city北京)三、 参数定义的完整顺序与高级特性在复杂的函数设计中我们常常需要组合使用上述参数。Python 对参数的定义顺序有严格的规范必须遵守仅限位置参数 (/) → 标准位置参数 → 默认参数 → 可变位置参数 (*args) → 仅限关键字参数 (*) → 可变关键字参数 (**kwargs)此外Python 3.8 引入了/和*作为分隔符用于强制限定传参方式/左侧的参数只能通过位置传递不能使用关键字。*右侧的参数必须通过关键字传递。defcomplex_func(a,b,/,c,d10,*args,e,f20,**kwargs): a, b: 仅限位置参数 c: 标准位置参数 d: 默认参数 *args: 可变位置参数 e: 仅限关键字参数 f: 仅限关键字默认参数 **kwargs: 可变关键字参数 print(a,b,c,d,args,e,f,kwargs)# 合法调用complex_func(1,2,3,4,5,e6,f7,extratest)# complex_func(a1, b2, c3, e6) # 报错a和b不能关键字传参# complex_func(1, 2, 3, 4, 5, 6) # 报错e必须关键字传参参数解包技术在调用函数时星号同样具备“解包”功能。*可将列表/元组解包为位置参数**可将字典解包为关键字参数。defmultiply(x,y,z):returnx*y*z nums[2,3,4]print(multiply(*nums))# 等价于 multiply(2, 3, 4)输出: 24info{x:2,y:3,z:4}print(multiply(**info))# 等价于 multiply(x2, y3, z4)输出: 24四、 命令行参数传递技术除了函数内部的参数传递在编写 Python 脚本CLI 工具时我们还需要接收来自终端的命令行参数。Python 标准库提供了argparse模块第三方库click则提供了更优雅的装饰器语法。1. 使用 argparse标准库importargparsedefsay_hello(name):print(fHello{name}!)if__name____main__:parserargparse.ArgumentParser(description命令行问候工具)parser.add_argument(--name,-n,help你的名字,defaultWorld)argsparser.parse_args()say_hello(args.name)# 终端运行: python script.py --name Alice# 输出: Hello Alice!2. 使用 click第三方库importclickclick.command()click.option(--name,-n,defaultWorld,help你的名字)defsay_hello(name):print(fHello{name}!)if__name____main__:say_hello()总结Python 的参数传递技术建立在“对象引用传递”的底层逻辑之上。在实际开发中熟练掌握位置参数、关键字参数、默认参数以及*args和**kwargs的组合使用能够让你的函数接口设计得更加灵活、健壮且易于扩展。同时务必警惕可变默认参数的陷阱并善用参数解包和命令行参数解析工具以提升代码的工程化水平。
RELATED

相关推荐

四款实战级数据恢复工具对比:EaseUS、Disk Drill、R-Studio与PhotoRec

四款实战级数据恢复工具对比:EaseUS、Disk Drill、R-Studio与PhotoRec

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/15 8:54:25
医药情报数据库选型:从PDF阅读器到战略操作系统

医药情报数据库选型:从PDF阅读器到战略操作系统

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/15 8:54:25
2026论文AI写作软件怎么选?亲测20款后给出选型思路与避坑指南

2026论文AI写作软件怎么选?亲测20款后给出选型思路与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/15 8:49:24
MORE NEWS

更多资讯

📰

人脸检测和行人检测2:YOLOv8 YOLO11 YOLO26 实现人脸检测和行人检测(含数据集和训练代码)

人脸检测和行人检测2:YOLOv8 YOLO11 YOLO26实现人脸检测和行人检测(含数据集和训练代码) 目录 人脸检测和行人检测2:YOLOv8 YOLO11 YOLO26实现人脸检测和行人检测(含数据集和训练代码) 1. 前言 2. 人脸检测和行人检测数据集说明 (1&…

📰

Java面试项目难点怎么答:模板、实战与追问应对

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

天翼云自动挂机脚本

Docker 一键部署 mkdir -p ./ctyun-keeper-datadocker run -d \--name ctyun-keeper \-p 9845:9845 \-v "$(pwd)/ctyun-keeper-data:/app/data" \--restart unless-stopped \yin26287903/ctyun-keeper:latest vay1314/CtYun-Keeper: 天翼云电脑管理工具,…

📰

CANoe_中的低级加密_CAPL_function_SecMgrCANoeClient.vMod

🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】🍅 玩转CANoe&…

📰

AUTOSAR_ASRPDUIL_-_通过_CAPL_实现用户自定义的端到端_E2EE_校验和报文计数器

🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】🍅 玩转CANoe&…

📰

一键RESP电荷计算: gaussian 16 + AmberTools

[欢迎浏览我的CSND博客!] [Blockbuater-drug] [...点击进入] 摘要:本文系统梳理从 Gaussian 16 到 AMBER 的 RESP 电荷计算全链路,对比 Gasteiger、AM1-BCC 与 RESP 三种方案的精度与速度,并给出 4 阶段完整流程。作者结合实战…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬