python中参数传递详解

python中参数传递详解

经验文章nimo972025-04-27 16:02:212A+A-

在 Python 中,参数传递是通过 "对象引用传递"(也称为 "按共享传递")的方式进行的。这意味着函数接收的是对象的引用(内存地址),而不是对象的副本或值本身。但根据对象的可变性(可变对象和不可变对象),表现可能有所不同。


1. 不可变对象(Immutable)的参数传递

不可变对象(如整数、字符串、元组等)在函数内部修改时,会创建一个新的对象,而不会影响原始对象。

示例:

def modify_num(num):
    num += 10
    print("函数内修改后:", num)  # 输出 20

x = 10
modify_num(x)
print("函数外原始值:", x)  # 输出 10(未被修改)

2. 可变对象(Mutable)的参数传递

可变对象(如列表、字典、集合等)在函数内部修改时,会直接修改原始对象。

示例:

def modify_list(lst):
    lst.append(4)
    print("函数内修改后:", lst)  # 输出 [1, 2, 3, 4]

my_list = [1, 2, 3]
modify_list(my_list)
print("函数外原始值:", my_list)  # 输出 [1, 2, 3, 4](被修改)

说明

  • lst 和 my_list 指向同一内存地址,所以修改会直接影响原始对象。

3. 参数传递的常见形式

Python 支持多种参数传递方式:

(1)位置参数(Positional Arguments)

def greet(name, message):
    print(f"{message}, {name}!")

greet("Alice", "Hello")  # 按顺序传递参数

(2)关键字参数(Keyword Arguments)

greet(message="Hi", name="Bob")  # 通过参数名指定

(3)默认参数(Default Arguments)

def greet(name, message="Hello"):
    print(f"{message}, {name}!")

greet("Alice")  # 使用默认值 "Hello"

(4)可变长度参数

  • *args:接收任意数量的位置参数(元组形式)。
  • **kwargs:接收任意数量的关键字参数(字典形式)。
def show_args(*args, **kwargs):
    print("位置参数:", args)
    print("关键字参数:", kwargs)

show_args(1, 2, 3, a=4, b=5)

关键点总结

  1. 对象引用传递:Python 始终传递对象的引用,而非副本。
  2. 不可变对象:函数内修改会创建新对象,原始对象不变。
  3. 可变对象:函数内修改会直接影响原始对象。
  4. 可通过 copy() 或 deepcopy 避免意外修改可变对象。

如果需要更深入的控制(如避免修改可变对象),可以显式创建副本:

import copy
def safe_modify(lst):
    lst_copy = copy.deepcopy(lst)  # 深拷贝
    lst_copy.append(4)
    return lst_copy

点个赞加收藏呗!最好加个关注

点击这里复制本文地址 以上内容由nimo97整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

尼墨宝库 © All Rights Reserved.  蜀ICP备2024111239号-7