Python pass-by-value and pass-by-reference [Python参数的值传递和引用传递]
Published: Dec. 12, 2020
Last Updated: Oct. 05, 2021
使用 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
有些是mutable
。immutable
数据类型包括Tuple
,Int
,Float
,Complex
,Stringfrozen set [note: immutable version of set]
,Bytes
,这些类型作为参数时,就是值传递,反之亦然。
综上所述, 如果传递的变量类型是数值、字符串、布尔等类型,那么就是值传递,如果传递的变量类型是序列、对象等复合类型,就是引用传递。值传递无法修改原变量,但是引用传递可以修改原变量