面试题答案
一键面试按值调用和按引用调用基本原理区别
- 按值调用:函数接收的是实际参数值的副本。在函数内部对参数的任何修改,都只影响这个副本,而不会影响原始变量。
- 按引用调用:函数接收的是实际参数的内存地址(引用)。在函数内部对参数的修改,会直接影响到原始变量,因为它们指向同一块内存空间。
处理不可变对象时的表现
- 按值调用表现: 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
。
- 按引用调用表现:虽然 Python 没有严格意义的按引用调用,但如果按照按引用调用的概念,在函数内修改不可变对象应该影响原始对象,然而在 Python 中不可变对象无法在原处修改,所以实际情况是类似按值调用,函数内修改不影响原始对象。
处理可变对象时的表现
- 按值调用表现: 若按严格按值调用,函数接收可变对象副本,修改副本不影响原始对象。但在 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 传递可变对象(如列表、字典)时传递的是对象的引用,并非副本。
- 按引用调用表现:
Python 处理可变对象类似按引用调用。函数接收可变对象的引用,在函数内对对象的修改会直接反映到原始对象上,如上述列表的例子,函数内对
lst
(指向original_list
的引用)的修改,直接改变了original_list
。