一文搞懂Python的函数传参机制

yizhihongxing

一文搞懂Python的函数传参机制

函数是Python中的重要组件,而函数参数则是Python函数的基本组成部分之一。本文将深入讲解Python的函数传参机制,其中包括以下内容:

  • 函数调用时参数的传递方式
  • 函数参数的默认值
  • 可变参数(args 和 *kwargs)
  • 参数传递时的深拷贝与浅拷贝

函数调用时参数的传递方式

Python中的参数传递有两种方式,分别是值传递和引用传递。值传递是指,传递给函数的是对象的一个副本,而引用传递是指,传递给函数的是对象的一个引用。其中,大多数情况下采用的是引用传递的方式。

下面通过一个示例来说明:

def change(x):
    x = 2
    print("函数内 x 的值为:", x)

y = 1
print("函数调用前 y 的值为:", y)
change(y)
print("函数调用后 y 的值为:", y)

此函数接收一个参数 x,并将其值修改为 2,并在函数内打印出值。在主程序中定义了变量 y,并分别在函数调用前后打印其值。运行结果为:

函数调用前 y 的值为: 1
函数内 x 的值为: 2
函数调用后 y 的值为: 1

从结果可以看出,函数内部修改了 x 的值,但是 y 的值并没有改变。这说明,当函数调用时,会将 y 的值的一个副本传递给函数,而函数内修改的是这个副本的值,而不是 y 的值本身。

函数参数的默认值

Python中可以为函数参数设置默认值,这样当用户没有为这个参数传入值时,函数就会使用默认值。在定义函数时,可以在参数后面使用“=默认值”的形式指定默认值。示例如下:

def print_info(name, age=20):
    print("姓名:", name)
    print("年龄:", age)

print_info("小明") # 如果没有传入年龄参数,则默认使用20

运行结果为:

姓名: 小明
年龄: 20

可变参数(args 和 *kwargs)

当我们不确定函数会有多少个参数时,可以使用可变参数。Python中有两种形式的可变参数:

  • *args:将多个无名参数打包成一个元组传入。
  • **kwargs:将多个关键字参数打包成一个字典传入。

示例如下:

def print_score(*args, **kwargs):
    for arg in args:
        print(arg)
    for key, value in kwargs.items():
        print(key, ":", value)

print_score(1,2,3,语文=90,数学=80) # 输出1,2,3和语文:90和数学:80

深拷贝与浅拷贝

在Python中,当我们传递一个对象类型的变量时,实际上是将该变量的引用传递给了函数。如果在函数内部修改了该变量的值,那么实际上也就修改了原来的变量值,这就是浅拷贝。相比之下,深拷贝是指将变量的值完全复制一份,与原来的变量没有关系。

示例如下:

def change_list(mylist):
    another_list = mylist
    another_list[0] = 99
    return another_list

lst = [1,2,3]
print(lst)
result = change_list(lst)
print(result)
print(lst)

这个示例定义了一个函数 change_list,它接受一个列表类型的参数 mylist。在函数内部将mylist赋值一份给 another_list,并修改了 another_list 的第一个元素为99。在主函数中,先输出了 lst 的值,再调用 change_list 函数,将结果赋值给 result,并输出 lst 和 result 的值。运行结果如下:

[1, 2, 3]
[99, 2, 3]
[99, 2, 3]

从输出结果可以看出,函数内部修改了 another_list 的值,而这就相当于修改了 lst 的值,因为它们都是对同一数据的引用。这就是Python中的浅拷贝。

如果想使用深拷贝,则可以使用 copy 模块中的 deepcopy 函数,如下所示:

import copy

def change_list_deepcopy(mylist):
    another_list = copy.deepcopy(mylist)
    another_list[0] = 99
    return another_list

lst2 = [1,2,3]
print(lst2)
result2 = change_list_deepcopy(lst2)
print(result2)
print(lst2)

该函数与之前示例中的函数类似,只不过在赋值操作中使用了 copy.deepcopy 函数进行深拷贝操作。运行结果如下:

[1, 2, 3]
[99, 2, 3]
[1, 2, 3]

从输出结果可以看出,函数内部修改了 another_list 的值,但是 lst 的值并没有被改变,这就是Python中的深拷贝。

至此,本文详细讲解了Python的函数传参机制,包括函数调用时参数的传递方式,函数参数的默认值,可变参数以及参数传递时的深拷贝与浅拷贝。希望能对Python学习者有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文搞懂Python的函数传参机制 - Python技术站

(1)
上一篇 2023年6月5日
下一篇 2023年6月5日

相关文章

  • Python 中获取数组的子数组示例详解

    Python 中获取数组的子数组示例详解 在 Python 中,我们可以通过一些简单的方式来获取数组的子数组。在这篇文章中,我们将介绍两种获取数组子数组的方法以及相应的代码示例。 方法一:切片法 切片法是 Python 中非常常用的一种遍历数组的方法,我们可以通过它快速获取一个数组的子数组。 例如,如果我们有如下的一个数组 arr: arr = [0, 1,…

    python 2023年6月5日
    00
  • Python最常用的20 个包总结

    Python是一种功能强大的编程语言,拥有丰富的第三方包和库。在这些包和库中,有一些是最常用的,可以帮助Python开发人员更快地开发应用程序。以下是Python最常用的20个包的总结。 1. NumPy NumPy是Python中用于科学计算的基本包。它提供了一个强大的N维数组对象,以及许多用于操作这些数组的函数。以下是一个示例,演示如何使用NumPy计算…

    python 2023年5月15日
    00
  • 14面向对象

    面向对象 面向对象编程介绍 面向对象编程:Object Oriented Programming,简称OOP,是一种程序设计思想。需要注意的是,与之对应的是面向过程编程思想。实际上,能够使用面向对象编程思想实现的程序,也都能通过面向过程完成。只是看哪种思想更适合当前开发需求。 面向过程与面向对象区别 面向过程:根据业务逻辑从上到下写代码  面向对象:将数据与…

    python 2023年4月17日
    00
  • Python+MySQL随机试卷及答案生成程序的示例代码

    下面是Python+MySQL随机试卷及答案生成程序的完整攻略,包含了示例代码和两条示例说明。 Python+MySQL随机试卷及答案生成程序 程序功能 本程序可生成随机试卷及答案。通过输入试卷的问题、选项及答案,程序会将输入的信息存储在MySQL数据库中,并在程序运行时,随机从数据库中选择指定数量的题目生成随机试卷和答案。 实现步骤 1. 数据库设计 本程…

    python 2023年6月3日
    00
  • wxPython之解决闪烁的问题

    wxPython之解决闪烁的问题 当使用wxPython来创建GUI时,有时候会出现控件闪烁的问题,这会让用户感到不舒服。下面介绍几种解决控件闪烁问题的方法。 方法一:使用双缓冲技术 双缓冲是一种有效的控制闪烁的技术。使用双缓冲技术,可以将画面的绘制和显示分开,先将绘制内容缓存至一个后台缓冲区,再将整张缓冲区的内容一次性地显示到屏幕上。这样就能够避免因为一部…

    python 2023年5月31日
    00
  • baselines示例程序train_cartpole.py的ImportError

    首先我们需要了解一下baselines是什么。baselines 是开源的深度增强学习工具包,旨在通过起点代码和强化学习最新技术的易于使用的实现来加速研究进展。train_cartpole.py 是其中一个示例程序,用来演示 OpenAI gym CartPole-v0 环境。当我们在执行该程序时,有时会遇到 ImportError 的错误。 下面是解决 t…

    python 2023年5月13日
    00
  • 利用Python将社交网络进行可视化

    利用Python将社交网络进行可视化 社交网络是现代社会中非常重要的一部分,它们可以帮助我们了解人们之间的联系和互动。Python提供了一些强大的工具,可以帮助我们将社交网络进行可视化,以便更好地理解和分析它们。本文将详细讲解如何使用Python将社交网络进行可视化。 数据准备 在进行社交网络可视化之前,我们需要准备好数据。社交网络数据通常以图形的形式表示,…

    python 2023年5月15日
    00
  • python爬取网易云音乐热歌榜实例代码

    下面是详细的攻略: Python爬取网易云音乐热歌榜实例代码 Python爬虫是一种常用的数据采集方式,可以帮助我们快速获取互联网上的各种数据。本文将手把手教你如何使用Python爬取网易云音乐热歌榜,并提供两个示例说明。 分析网页结构 在爬取网页之前,我们需要先分析网页的结构。可以使用Chrome浏览器的开发者工具进行分析。在打开网页后,我们可以按下F12…

    python 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部