在Python中,函数参数可以是不可变对象(如整数、字符串、元组)或可变对象(如列表、字典)。当传递不可变对象时,函数内部对这些对象的任何修改都不会影响实参;而当传递可变对象时,函数内部对这些对象的修改会影响实参。
不可变对象
字符串、 元组、 数字是不可变的,意味着一旦创建,它们的值就不能被改变。
在函数内部尝试修改这些不可变对象的值会导致错误。
可变对象
列表、 字典、 集合是可变的,意味着它们的值可以在函数内部被改变。
当传递列表给函数时,函数内部对列表的修改会反映到实参上。
示例
传递不可变对象(字符串、元组、数字)def change_immutable(n):n = 'Mr Gumby' 错误:无法修改字符串names = ['Mrs Entity', 'Mrs. Thing']change_immutable(names)print(names) 输出:['Mrs Entity', 'Mrs. Thing']传递可变对象(列表)def change_mutable(n):n = 'Mr Gumby' 正确:可以修改列表names = ['Mrs Entity', 'Mrs. Thing']change_mutable(names)print(names) 输出:['Mr Gumby', 'Mrs. Thing']
解决方法
如果需要在函数内部修改列表,可以创建列表的副本,在副本上进行修改。
def selection_sort(xx):x = xx[:] 创建列表的副本i = 0while i < len(x):minindex = ifor j in range(i+1, len(x)):if x[j] < x[minindex]:minindex = jx[i], x[minindex] = x[minindex], x[i]i += 1return xnumbers = [6, 2, 8, 1, 3, 5]sorted_numbers = selection_sort(numbers)print(sorted_numbers) 输出:[1, 2, 3, 5, 6, 8]print(numbers) 输出:[6, 2, 8, 1, 3, 5](实参未被改变)
总结
当传递不可变对象时,函数内部无法修改实参。
当传递可变对象时,函数内部对实参的修改会反映到实参上。
若要避免修改实参,可以在函数内部创建对象的副本进行操作

