Python函数传递可变对象和不可变对象的区别
Python中的函数参数按照对象的可变性可以分为不可变对象和可变对象。不可变对象包括数字、字符串和元组等,而可变对象包括列表和字典等。
传递不可变对象时,函数会创建一个新的对象,并将参数的值复制到新的对象中。这意味着,函数内部对参数进行的任何修改都不会影响到原始对象。
例如,考虑以下代码:
def change_number(num):
num = 10
x = 5
change_number(x)
print(x) # 输出为5
在这个例子中,我们定义了一个函数change_number,它接受一个参数num。在函数内部,我们将num的值修改为10,但是在函数外部打印x时,它的值仍然是5。这是因为x是一个不可变对象,在函数中修改num的值并不会影响到原始对象。
当我们传递可变对象作为参数时,函数操作的是原始对象的引用,而不是创建一个新的对象。这意味着,函数内部对参数进行的修改会影响到原始对象。
例如,考虑以下代码:
def change_list(lst):
lst.append(4)
my_list = [1, 2, 3]
change_list(my_list)
print(my_list) # 输出为[1, 2, 3, 4]
在这个例子中,我们定义了一个函数change_list,它接受一个参数lst。在函数内部,我们使用lst.append(4)在原始列表的末尾添加了一个元素4。在函数外部打印my_list时,它的值变为了[1, 2, 3, 4]。这是因为my_list是一个可变对象(列表),在函数中修改lst的值会直接作用于原始对象。
需要注意的是,尽管函数可以修改可变对象的值,但是修改对象的身份(即将其引用指向另一个对象)是不可能的。
例如,考虑以下代码:
def change_list(lst):
lst = [4, 5, 6]
my_list = [1, 2, 3]
change_list(my_list)
print(my_list) # 输出为[1, 2, 3]
在这个例子中,我们定义了一个函数change_list,它接受一个参数lst。在函数内部,我们将lst的值修改为[4, 5, 6],但是在函数外部打印my_list时,它的值仍然是[1, 2, 3]。这是因为在函数内部我们修改了lst的值,但是这并没有影响到原始对象my_list的身份。
总结起来,Python中函数传递不可变对象和可变对象的区别在于:
- 不可变对象在函数内部进行的任何修改都不会影响到原始对象;
- 可变对象在函数内部进行的某些修改可能会影响到原始对象的值;
- 不管是可变对象还是不可变对象,在函数内部修改对象的身份是不可能的。
了解这些特点可以帮助我们在编写函数时更好地使用和处理参数。
