You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中可直接用列表传参,为何还需要*args与**kwargs?

类初始化两种传参写法的合理性说明

两种写法均具备实用性,可根据场景选择

两种写法都是合法可运行的,适用场景不同:

  • 不使用*args的版本
    代码如下:
    class Student:
        def __init__(self, name, courses):
            self.name = name
            self.courses = courses
    
    Peter = Student('Peter', ['Math', 'English'])
    
    这种写法适合courses参数本身就是以集合形式存在的场景,逻辑更清晰,也方便你在__init__中对courses做整体的类型校验、去重、过滤等预处理,调用方也能明确感知到第二个参数需要传入聚合后的课程集合。
  • 使用*args的版本
    代码如下:
    class Student:
        def __init__(self, name, *courses):
            self.name = name
            self.courses = courses
    
    Peter = Student('Peter', 'Math', 'English')
    
    这种写法适合课程数量不固定、调用时参数是零散获取的场景,不需要调用方手动把课程封装成列表,调用语法更简洁。如果要传入已经封装好的列表,只需要调用时做解包即可:Peter = Student('Peter', *['Math', 'English'])。

不存在必须使用*args的绝对场景

本质上args只是Python提供的语法糖,所有用args实现的逻辑都可以通过传入集合参数的方式实现,不存在前者能正常运行、后者必然报错的场景。但部分场景下用*args会更符合编码习惯、减少冗余代码:

  • 方法需要接收任意数量的同类型位置参数,且调用方传入零散参数的频率更高,比如Python内置的print()、max()等函数,都是用*args接收参数,避免每次调用都要手动封装列表,更符合使用者的直觉。
  • 做装饰器开发时,用*args, **kwargs可以兼容任意原函数的参数列表,不需要提前知道原函数的参数结构,这种场景下用*args会大幅简化代码。

内容的提问来源于stack exchange,提问作者Henry Chan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 14:24:01