Python 中的参数传递、返回值、浅拷贝、深拷贝

  • Post category:Python

下面我会详细讲解Python中的参数传递、返回值、浅拷贝和深拷贝。

参数传递

在Python中,参数是通过引用传递的,而不是通过值传递的。也就是说,如果一个函数修改了一个可变对象作为参数传递进来的值,那么这个修改将在调用函数的地方保持。

示例:

def modify_list(l):
    l.append(1)

my_list = []
print(my_list)  # 输出 []
modify_list(my_list)
print(my_list)  # 输出 [1]

在上面的示例中,我们定义了一个函数modify_list(),该函数将一个元素添加到传递进来的列表中。当我们传递一个空列表my_list到函数modify_list()时,在函数内部对该列表进行修改后,my_list的值也被相应地修改了。

返回值

Python函数可以返回一个或多个值。在Python中返回多个值时,实际上是将多个值打包成元组并返回的。可以使用元组解包来获取这些返回值。

示例:

def get_name_and_age():
    name = 'Alice'
    age = 20
    return name, age

name, age = get_name_and_age()
print(name)  # 输出 Alice
print(age)   # 输出 20

在上面的示例中,get_name_and_age()函数返回了名字和年龄。我们使用元组解包将这些返回值分别赋值给变量name和age。

浅拷贝

浅拷贝是指复制一个对象,并将其内容复制到新对象中。如果原始对象包含一个或多个可变对象(例如列表或字典),则复制的对象将包含对原始对象中可变对象的引用。因此,如果原始对象的可变对象被修改,则浅复制的对象中的相应对象也将被修改。

示例:

original_list = [1, 2, [3, 4]]
new_list = original_list.copy()
original_list[2][0] = 5
print(original_list)  # 输出 [1, 2, [5, 4]]
print(new_list)       # 输出 [1, 2, [5, 4]]

在上面的示例中,我们使用copy()函数进行浅拷贝,将original_list的副本存储到变量new_list中。然后,我们修改了original_list中的第三个元素,即原始列表中的可变列表。结果发现,在新列表new_list中也被修改了。这是因为浅拷贝只复制了原始列表和嵌套对象之间的引用,而没有复制嵌套对象。

深拷贝

深拷贝是指在复制对象时,将其所有内容复制到新对象中,而不仅仅是将其引用复制到新对象中。因此,如果原始对象的可变对象被修改,复制的对象将不会受到影响。

示例:

import copy

original_list = [1, 2, [3, 4]]
new_list = copy.deepcopy(original_list)
original_list[2][0] = 5
print(original_list)  # 输出 [1, 2, [5, 4]]
print(new_list)       # 输出 [1, 2, [3, 4]]

在上面的示例中,我们使用deepcopy()函数进行深拷贝,将original_list的副本存储到变量new_list中。然后,我们修改了original_list中的第三个元素,即原始列表中的可变列表。结果发现,这次只有原始列表被修改了,而新列表new_list中的值没有受到影响。这是因为深拷贝将所有嵌套对象都进行了复制,因此没有任何对象被共享。

总结起来,Python中的参数传递、返回值、浅拷贝和深拷贝都是非常重要和基础的概念,对于开发人员来说都必须掌握。