面试题答案
一键面试在Python中,参数传递既不是严格意义上的按值传递,也不是按引用传递,而是按对象的共享传递(call by sharing)。
不可变对象(如整数、字符串)作为参数传递
def change_num(num):
num = num + 1
return num
a = 5
result = change_num(a)
print(a)
print(result)
在上述例子中,a
是整数,为不可变对象。在函数change_num
中修改num
的值,并不会影响外部变量a
的值。原因是不可变对象一旦创建,其值就不能被改变。当传递不可变对象时,函数接收到的是对象值的副本,但实际上指向的是同一个对象(在Python中,对象通过引用传递,但不可变对象的值无法改变)。函数内部对num
的重新赋值,是让num
指向了一个新的对象,而不是改变原对象的值。
可变对象(如列表、字典)作为参数传递
def change_list(lst):
lst.append(4)
return lst
b = [1, 2, 3]
result = change_list(b)
print(b)
print(result)
对于列表这种可变对象,当传递给函数change_list
时,函数内对列表的修改会影响到外部的列表b
。这是因为可变对象在传递时,函数接收到的是对象的引用,函数内部对对象的操作直接作用于原对象本身,而不是副本。所以在函数中调用append
方法修改列表,外部的列表也随之改变。
总结来说,Python的参数传递机制,使得不可变对象在函数内看似按值传递,可变对象看似按引用传递,但本质上都是按对象共享传递,即函数接收的是对象的引用,只不过不可变对象无法在原对象基础上修改值。