新闻详情

新闻详情

首页 / 资讯中心 / 详情

在 Python 中,函数参数传递是编程的核心基础。Python 的参数传递机制与其他语言(如 C/C++)有所不同

发布时间:2026/9/15 8:54:04来源:尧图网络
在 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

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

LS-DYNA许可证管理机制与优化实践 2026/9/15 11:42:45

LS-DYNA许可证管理机制与优化实践

1. LS-DYNA许可证管理机制概述在工程仿真领域,LS-DYNA作为显式动力学分析的行业标准工具,其许可证管理机制直接影响着大规模计算任务的稳定执行。不同于普通软件的简单验证模式,LS-DYNA采用了一套包含心跳检测、作业绑定与会话跟踪的复合型授…

阅读更多 →
Freebuff 构建指南:用编译期标志从 Codebuff CLI 剥离出免费版终端编码 Agent 2026/9/15 11:42:45

Freebuff 构建指南:用编译期标志从 Codebuff CLI 剥离出免费版终端编码 Agent

Freebuff 构建指南:用编译期标志从 Codebuff CLI 剥离出免费版终端编码 Agent 【免费下载链接】freebuff The free coding agent 项目地址: https://gitcode.com/GitHub_Trending/cod/freebuff 导读 本篇文章基于仓库中的 freebuff/SPEC.md 产品级技术规格&…

阅读更多 →
Flue Vite插件深度解析:‘use agent‘如何被扫描与转换 2026/9/15 11:42:45

Flue Vite插件深度解析:‘use agent‘如何被扫描与转换

Flue Vite插件深度解析:use agent如何被扫描与转换 【免费下载链接】flue The sandbox agent framework. 项目地址: https://gitcode.com/GitHub_Trending/flue1/flue Flue 是一款面向开发者的沙箱智能体(Agent)框架,它的核…

阅读更多 →
Faker::Music::Phish 完全指南:用 Faker 生成 Phish 乐队专辑、成员与曲目假数据 2026/9/15 11:42:45

Faker::Music::Phish 完全指南:用 Faker 生成 Phish 乐队专辑、成员与曲目假数据

Faker::Music::Phish 完全指南:用 Faker 生成 Phish 乐队专辑、成员与曲目假数据 【免费下载链接】faker A library for generating fake data such as names, addresses, and phone numbers. 项目地址: https://gitcode.com/GitHub_Trending/fake/faker 本指…

阅读更多 →
OpenMetadata Oracle 连接器接入指南:权限配置、连接参数与源码级原理剖析 2026/9/15 11:42:45

OpenMetadata Oracle 连接器接入指南:权限配置、连接参数与源码级原理剖析

OpenMetadata Oracle 连接器接入指南:权限配置、连接参数与源码级原理剖析 【免费下载链接】OpenMetadata The Open Context Layer for Data and AI , OpenMetadata is the open platform for building trusted data context and business semantics for humans, AI…

阅读更多 →
RISC-V SoC落地实战:Rocket Chip+TileLink+Vivado工程缝合指南 2026/9/15 11:39:44

RISC-V SoC落地实战:Rocket Chip+TileLink+Vivado工程缝合指南

1. 这不是又一个“RISC-V有多好”的空谈,而是直面SoC开放生态里最硌脚的那颗沙子你有没有试过在GitHub上找到一个标着“RISC-V SoC”的开源项目,兴冲冲clone下来,想把它烧进FPGA跑起来,结果卡在第一步——连时钟树怎么配都不知道&…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞