了解Python函数的参数传递方式及常见问题
Python的函数参数可以按照传递方式分为两种:值传递和引用传递。下面会详细介绍这两种传递方式及相关常见问题。
1. 值传递(传递的是变量的副本):
值传递是指函数调用时,会把实际参数的值复制一份给形式参数,此后形式参数和实际参数是完全独立的,彼此之间的修改互不影响。在Python中,如下几种情况下使用的是值传递方式:
- 不可变对象作为参数:例如数字、字符串和元组等。
- 可变对象通过值传递方式传递:例如列表是可变对象,但在函数调用时仍然是值传递。
值传递的常见问题:
(1) 修改不可变对象的值不会影响原对象的值:
def change_value(num):
num = 10
a = 5
change_value(a)
print(a) # 输出结果为5
(2) 传递可变对象,修改对象的值会影响原对象:
def change_list(lst):
lst.append(4)
b = [1, 2, 3]
change_list(b)
print(b) # 输出结果为[1, 2, 3, 4]
2. 引用传递(传递的是变量的地址):
引用传递是指函数调用时,会将实际参数的引用传入函数,形参与实参指向同一个对象,在函数内部对形参的修改会影响到实参。在Python中,如下几种情况下使用的是引用传递方式:
- 可变对象作为参数:例如列表、字典和集合等。
- 对象的引用传递:例如函数传递对象。
引用传递的常见问题:
(1) 修改可变对象的值会影响原对象:
def change_list(lst):
lst.append(4)
b = [1, 2, 3]
change_list(b)
print(b) # 输出结果为[1, 2, 3, 4]
(2) 对象的引用传递:
def change_name(person):
person['name'] = 'Alice'
p = {'name': 'Bob'}
change_name(p)
print(p) # 输出结果为{'name': 'Alice'}
总结:
- 值传递是传递对象的副本,不影响原始对象,而引用传递是传递对象的引用,对对象的修改会影响到原始对象。
- 不可变对象在函数调用时使用值传递,修改不可变对象的值不会影响原对象。
- 可变对象在函数调用时使用引用传递,修改可变对象的值会影响原对象。
- 对象的引用传递可以理解为传递对象的地址,函数内部对形参的修改会影响到实参。
因此,在使用Python函数时,需要注意参数传递方式及对不可变和可变对象的理解,以避免产生不符合预期的结果。
