python中参数传递详解
在 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)
关键点总结
- 对象引用传递:Python 始终传递对象的引用,而非副本。
- 不可变对象:函数内修改会创建新对象,原始对象不变。
- 可变对象:函数内修改会直接影响原始对象。
- 可通过 copy() 或 deepcopy 避免意外修改可变对象。
如果需要更深入的控制(如避免修改可变对象),可以显式创建副本:
import copy
def safe_modify(lst):
lst_copy = copy.deepcopy(lst) # 深拷贝
lst_copy.append(4)
return lst_copy
点个赞加收藏呗!最好加个关注