使用 Python 时,经常会遇到的问题是

如果将一个变量作为参数传入函数,是否可以在函数内部改变这个变量的值

其实问题的本质就是函数参是值传递[pass-by-value]还是引用传递[pass-by-reference]

x = 20
def test(x):
    x = 40
test(x)
print(x)

# Output:
# x = 20

在上面的代码中,首先定义了变量:x,然后将其传入 test 函数,并在该函数中修改这个变量的值。最后在函数外部输出这个变量,得到的结果是它的值并没有改变。所以说,对于数值类型、字符串类型等一些简单类型,在函数内部可以修改变量的值,但不会影响到原始变量的值。也就是说,函数内部操作的参数变量实际上是 x 的一个副本。将变量传入函数

x = {"a":30, "b":20}

def test(x):
    x["a"] = 100

test(x)
print(x)

# Output:
# x = {"a":100, "b":20}

我们可以看到,如果将字典和列表变量传入函数,则是将该变量的引用传入,在函数内部修改字典和列表变量的值,是可以影响这个变量。

那么,具体那些数据类型是值传递哪些是引用传递呢,其实这个问题的本质在于,python 中有些数据变量是immutable有些是mutableimmutable数据类型包括Tuple,Int,Float,Complex,Stringfrozen set [note: immutable version of set],Bytes,这些类型作为参数时,就是值传递,反之亦然。

综上所述, 如果传递的变量类型是数值、字符串、布尔等类型,那么就是值传递,如果传递的变量类型是序列、对象等复合类型,就是引用传递。值传递无法修改原变量,但是引用传递可以修改原变量