MST

星途 面试题库

面试题:Python中按值调用与按引用调用的基础区别

请简要阐述Python中按值调用和按引用调用在基本原理上的区别,并举例说明在处理不可变对象和可变对象时这两种调用方式分别会有怎样的表现。
19.7万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

按值调用和按引用调用基本原理区别

  • 按值调用:函数接收的是实际参数值的副本。在函数内部对参数的任何修改,都只影响这个副本,而不会影响原始变量。
  • 按引用调用:函数接收的是实际参数的内存地址(引用)。在函数内部对参数的修改,会直接影响到原始变量,因为它们指向同一块内存空间。

处理不可变对象时的表现

  1. 按值调用表现: Python 中不可变对象(如整数、字符串、元组)的参数传递类似按值调用。例如:
def change_number(num):
    num = num + 1
    return num

original_num = 5
result = change_number(original_num)
print(original_num)  
print(result)  

这里original_num的值在函数调用后并未改变,因为num在函数内是original_num值的副本,对num的修改不影响original_num

  1. 按引用调用表现:虽然 Python 没有严格意义的按引用调用,但如果按照按引用调用的概念,在函数内修改不可变对象应该影响原始对象,然而在 Python 中不可变对象无法在原处修改,所以实际情况是类似按值调用,函数内修改不影响原始对象。

处理可变对象时的表现

  1. 按值调用表现: 若按严格按值调用,函数接收可变对象副本,修改副本不影响原始对象。但在 Python 中不是这样。例如:
def change_list(lst):
    lst.append(4)
    return lst

original_list = [1, 2, 3]
result_list = change_list(original_list)
print(original_list)  
print(result_list)  

这里original_list被修改了,因为 Python 传递可变对象(如列表、字典)时传递的是对象的引用,并非副本。

  1. 按引用调用表现: Python 处理可变对象类似按引用调用。函数接收可变对象的引用,在函数内对对象的修改会直接反映到原始对象上,如上述列表的例子,函数内对lst(指向original_list的引用)的修改,直接改变了original_list