PYTHON:实参为列表的函数

img

为什么实参为列表时,不需要用return来返回,而是直接可以修改了列表的元素?
不理解“实参是列表时,形参是列表的引用”这句话。
望指导,谢谢!

在 Python 中,函数参数的传递方式既可以是传值也可以是传引用,具体取决于参数的类型。在 Python 中,所有的变量都是对象,而对象可以是可变的或不可变的。
对于不可变类型的对象(如整数、字符串、元组等),函数参数的传递方式是传值,在函数中对这些参数的修改不会影响到函数外部对这些参数的值。例如:

def foo(x):
    x = x + 1
    print(x)

a = 1
foo(a)
print(a)  # 输出为 1,不会影响到函数外部的 a

对于可变类型的对象(如列表、字典等),函数参数的传递方式是传引用,在函数中对这些参数的修改会影响到函数外部对这些参数的值。例如:

def foo(lst):
    lst.append(1)
    print(lst)

a = [1, 2, 3]
foo(a)
print(a)  # 输出为 [1, 2, 3, 1],会影响到函数外部的 a

不过,即使对象是可变的,如果在函数内部重新给参数赋值,那么这个参数就不再是原来的对象,而是一个新的对象,此时函数内部对参数的修改依然不会影响到函数外部对参数的值。例如:

def foo(lst):
    lst = [1, 2, 3]
    print(lst)

a = [4, 5, 6]
foo(a)
print(a)  # 输出为 [4, 5, 6],函数内部重新给 lst 赋值,lst 不再是原来的 a,所以函数对 lst 的修改不会影响到函数外部的 a

实参是列表时,形参是列表的引用
所谓引用,就是指它本身不会把变量复制一份,而是还是指向调用者的那个列表
不仅是列表,对象也是引用
道理很简单,因为列表占用的内存可以很大,如果每次都复制,性能受不了,所以默认不复制,让程序员在需要的时候再复制。