Python-函数传参格式

Python 中参数传递本质是传递对象的引用。

  • 修改可变对象(如列表)会影响外部变量。
  • 重新赋值不会影响外部变量(因为引用指向了新对象)。

在 Python 中,当传递不可变对象(如整数、字符串、元组等)作为参数时,函数内部对参数的修改不会影响外部变量。这是因为不可变对象本身无法被就地修改,所有的“修改”操作都会生成新的对象,而外部的变量依然指向原来的对象。

基本参数类型

  • 位置参数

    1
    2
    3
    4
    def func(a, b, c):
    print(a, b, c)

    func(1, 2, 3) # 输出: 1 2 3
  • 关键字参数:通过关键字可以不按照位置

    1
    func(b=2, a=1, c=3)  # 输出: 1 2 3
  • 默认参数

    1
    2
    3
    4
    5
    def func(a, b=0):
    print(a + b)

    func(5) # 输出: 5 (b使用默认值0)
    func(5, 3) # 输出: 8

可变长度参数

  • 任意数量位置参数(*args): 接受多个位置参数,打包成元祖

    1
    2
    3
    4
    def func(*args):
    print(args)

    func(1, 2, 3) # 输出: (1, 2, 3)
  • 任意数量关键字参数(**kwargs): 接收多个关键字参数,打包为字典

    1
    2
    3
    4
    def func(**kwargs):
    print(kwargs)

    func(a=1, b=2) # 输出: {'a': 1, 'b': 2}

参数组合规则

  • 必须遵循如下顺序:

    位置参数 -> 默认参数 -> *args -> 仅关键字参数 -> **kwargs

    1
    2
    3
    4
    5
    def func(a, b=0, *args, c, d=1, ​**kwargs):
    print(a, b, args, c, d, kwargs)

    func(1, 2, 3, 4, c=5, d=6, e=7)
    # 输出: 1 2 (3,4) 5 6 {'e': 7}
  • 强制关键字参数(使用*分割)

    *符号之后的参数必须使用关键字传递

    1
    2
    3
    4
    5
    def func(a, *, b):
    print(a, b)

    func(1, b=2) # 正确
    func(1, 2) # 报错:takes 1 positional argument but 2 were given

参数解包(调用时)

  • 解包可迭代对象(*)

    1
    2
    3
    4
    5
    def func(a,b,c):
    print(a,b,c)

    args = [1,2,3]
    func(*args) ## 等价于 func(1, 2, 3), 输出 1,2,3
  • 解包字典(**)

    1
    2
    kwargs = {'a':1, 'b':2, 'c':3}
    func(**kwargs) ## # 等价于 func(a=1, b=2, c=3), 输出 1,2,3

Python-函数传参格式
https://jackiedai.github.io/2025/03/18/011Python/006Python-函数传参格式/
Author
lingXiao
Posted on
March 18, 2025
Licensed under