MST
星途 面试题库

面试题:Python中函数调用时参数传递机制

在Python中,函数调用时参数传递是按值传递还是按引用传递?请举例说明不可变对象(如整数、字符串)和可变对象(如列表、字典)作为参数传递时的表现,并解释原因。
26.9万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

在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的参数传递机制,使得不可变对象在函数内看似按值传递,可变对象看似按引用传递,但本质上都是按对象共享传递,即函数接收的是对象的引用,只不过不可变对象无法在原对象基础上修改值。