欢迎访问宙启技术站
智能推送

Python函数的参数传递:可变和不可变对象

发布时间:2023-06-06 07:26:00

在Python的函数使用中,有一个非常重要的概念,就是参数传递。这个概念是当你调用函数时,在调用函数时,你可以传递给函数一个或多个参数。在Python中,所有的参数都是对象,有些是可变对象,有些是不可变对象。这对于我们理解Python的参数传递机制非常重要,因为理解参数传递的机制将使我们更好地理解Python中的一些比较细微的概念。

在Python中,可变对象和不可变对象的定义很简单。不可变对象是值不可变的对象,而可变对象是值可变的对象。在Python中,常见的不可变对象包括int、float、bool和tuple类型的对象,而常见的可变对象则包括list、set和dict类型的对象。下面我们来看一下,不可变对象和可变对象在函数调用中的区别。

不可变对象在函数调用中的传递方式

当不可变对象(如int、float、bool和tuple类型的对象)被传递给Python函数时,Python会将参数值复制一份给函数,而函数会使用这份复制的值。这意味着当我们在函数内部修改这些不可变对象的值时,不会影响到调用者本身的对象。例如:

def my_func(x):
    x += 1
    print(x)
    
y = 1
my_func(y)
print(y)

在这个例子中,我们定义了一个函数my_func,它获取一个参数x。我们将一个整数值1赋值给y,并将y作为参数(值1)传递给函数my_func。在函数中,我们增加x的值1,然后打印出来。结果应该是2。主程序中,我们再次打印y的值,结果应该是1。因为Python在调用函数时复制了y的值,并将这个值赋值给参数x,而不是直接将y作为参数表示。所以,当我们在函数中增加x的值时,y的值并不会改变。因为int是不可变的对象,我们不能在函数中修改它的值。

可变对象在函数调用中传递方式

Python传递可变对象到函数中时,会传递这个对象的引用(地址),而不是复制一个新的对象。这意味着函数中对可变对象的任何修改都会影响到原对象,即使这个修改是在函数中进行的。例如:

def my_func(x):
    x.append(4)
    print(x)

l = [1, 2, 3]
my_func(l)
print(l)

在这个例子中,我们定义了一个函数my_func,它获取一个参数x。我们定义了一个列表l,其中包含1、2、3三个元素。我们将这个列表作为参数传递给函数my_func。在函数中,我们对x增加了一个元素4,然后打印出来。这个函数执行后,我们再次打印列表l的内容,发现它被修改为了[1, 2, 3, 4]。因为Python在传递对象的时候,传递的是对象的引用(地址),所以我们在函数中修改了它的值,定义原始列表l的值也被改变。

这两个例子展示了Python中传递不可变和可变对象的不同方式。理解参数传递的这个概念对Python编程至关重要。原则上,Python建议不要将可变对象作为函数的默认参数值。因为这些可变对象的值可以在函数中被修改,从而导致程序的不确定行为。