Python函数传值的方法有两种——传值调用(call by value)和传址调用(call by reference)。在理解这两种调用方式之前,我们需要先了解Python中的可变对象和不可变对象的概念。
Python中的可变对象包括列表、字典等,而不可变对象包括数字、字符串和元组等。在Python中,传不同类型的参数所采用的调用方法也会不同。
- 传值调用(call by value)
传值调用是指在函数调用时,将变量的值传递给函数的形参,函数对形参的任何修改都不会影响到原来的变量。
def increment(x):
x = x + 1
return x
a = 5
print(increment(a))
print(a)
在这个例子中,变量a
的值为5。在调用increment()
函数时,变量a
的值被赋给了形参x
。在函数内部对x
进行操作并返回结果,但是不对原来的变量a
进行任何修改。在函数调用结束后,a
的值仍然是5。
- 传址调用(call by reference)
在Python中,实际上没有传址调用的方式。但是,当我们向函数传递可变对象时,Python将使用传址的方式。这意味着函数中对于可变对象的任何修改都将影响到原始对象。
def modify_list(lst):
lst.append(4)
a = [1, 2, 3]
modify_list(a)
print(a)
在这个例子中,变量a
是一个列表。当调用modify_list()
函数时,变量a
被传递给了函数的形参lst
。在函数内部,我们对lst
进行修改并添加了一个新元素4。这个修改同样会影响到原来的变量a
,因为a
和lst
其实是同一个对象。
需要注意的是,这里所说的“修改”是指对对象本身的修改,而不是简单的修改对象的属性。简单的修改对象的属性并不会影响原始对象。
综上所述,Python中函数的传值方法有传值调用和传址调用两种。当传递不可变对象时,使用传值调用;当传递可变对象时,使用传址调用(实际上是缺省参数传递)。过程中,需要特别注意区分不可变对象和可变对象,以便正确地理解函数调用的行为。