参数传递机制
Python 使用的是“按对象引用传递”(pass by object reference)的方式。这意味着当你将一个对象作为参数传递给函数时,你实际上是在传递该对象的引用而不是副本。因此,如果在函数内部修改了可变对象(如列表、字典),这些修改会反映到外部的对象上;而对于不可变对象(如整数、字符串、元组),由于它们不能被修改,所以不会影响原始对象。
参数类型
位置参数(Positional Arguments) 这是最常见的参数传递方式,调用函数时按照定义顺序传递参数。
def greet(name, message):
print(f"Hello {name}, {message}")
greet("Alice", "Good morning!")
关键字参数(Keyword Arguments) 通过指定参数名来传递参数值,这样可以不按照定义顺序传递参数。
def greet(name, message):
print(f"Hello {name}, {message}")
greet(message="Good morning!", name="Alice")
默认参数(Default Arguments) 定义函数时为参数提供默认值,当调用函数时没有提供对应的参数值,则使用默认值。
def greet(name, message="Good day!"):
print(f"Hello {name}, {message}")
greet("Bob") # 使用默认消息
greet("Charlie", "How are you?") # 覆盖默认消息
可变数量的参数(*args 和 kwargs)
*args:允许你传入任意数量的位置参数,这些参数会被收集到一个元组中。
def sum_numbers(*args):
return sum(args)
print(sum_numbers(1, 2, 3)) # 输出6
*kwargs:允许你传入任意数量的关键字参数,这些参数会被收集到一个字典中。
def print_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_info(name="Alice", age=30)
可变对象 vs 不可变对象
对于不可变对象(如整数、字符串、元组),在函数内部对参数的任何改变都不会影响到外部的变量,因为实际上是在操作一个新的对象。
def modify_string(s):
s += " world"
print(s) # 输出 "hello world"
original = "hello"
modify_string(original)
print(original) # 输出 "hello"
对于可变对象(如列表、字典),在函数内部对参数的改变会影响到外部的变量,因为两者指向同一个对象。
def append_to_list(lst):
lst.append(4)
my_list = [1, 2, 3]
append_to_list(my_list)
print(my_list) # 输出 [1, 2, 3, 4]
通过理解这些概念,你可以更好地控制函数参数的传递方式,并根据需要选择最合适的参数传递策略。无论是简单的函数调用还是复杂的数据处理逻辑,正确地使用参数传递机制都是至关重要的。