在 Python 中,参数的传递方式可以是传值(pass by value)或传引用(pass by reference)。然而,实际上 Python 中的参数传递方式是通过对象的引用进行传递。简单来说,当传递不可变对象时(如数字、字符串、元组等),Python 采用的是传值的方式,即创建了对象的副本,并将副本传递给函数或赋值给其他变量。这意味着在函数内部修改参数的值不会影响到原始对象。然而,当传递可变对象时(如列表、字典、集合等),Python 采用的是传引用的方式,即传递的是对象的引用(内存地址),而不是对象的副本。这意味着在函数内部对参数对象的修改会影响到原始对象。
def modify_value(num):
num = 10 # 修改了参数的值
print(num)
x = 5
modify_value(x) # 输出 10
print(x) # 输出 5,原始对象未受影响
def modify_list(lst):
lst.append(4) # 修改了参数对象
print(lst)
my_list = [1, 2, 3]
modify_list(my_list) # 输出 [1, 2, 3, 4]
print(my_list) # 输出 [1, 2, 3, 4],原始对象被修改
需要注意的是,虽然 Python 中的参数传递方式是通过对象引用进行的,但实际上并不涉及指针的操作。因此,我们可以将参数传递方式描述为"按对象引用传递",而不是传统意义上的"按引用传递"。
此外,对于不可变对象,例如元组,尽管不能直接修改其值,但可以通过重新赋值变量来改变引用的对象。这样的操作会生成一个新的对象,并将变量重新指向新的对象。
def modify_tuple(tpl):
tpl = (4, 5, 6) # 重新赋值变量,生成新的元组对象
print(tpl)
my_tuple = (1, 2, 3)
modify_tuple(my_tuple) # 输出 (4, 5, 6)
print(my_tuple) # 输出 (1, 2, 3),原始对象未受影响
总结而言,Python 的参数传递方式是通过对象引用进行的,对于不可变对象是传值的方式,对于可变对象是传引用的方式。