在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 = 0
while i < len(x):
minindex = i
for j in range(i+1, len(x)):
if x[j] < x[minindex]:
minindex = j
x[i], x[minindex] = x[minindex], x[i]
i += 1
return x
numbers = [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](实参未被改变)
总结
当传递不可变对象时,函数内部无法修改实参。
当传递可变对象时,函数内部对实参的修改会反映到实参上。
若要避免修改实参,可以在函数内部创建对象的副本进行操作