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

一文搞懂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中itertools模块zip_longest函数详解

    Python中itertools模块zip_longest函数详解 简介 在Python的标准库中,itertools模块提供了很多用于实现迭代算法的工具,其中就包括zip_longest函数。本篇文章主要讲解zip_longest函数在Python的使用方法以及两个示例。 zip_longest函数用法 zip_longest函数用于并行迭代多个可迭代对象…

    python 2023年6月3日
    00
  • Python暴力破解Mysql数据的示例

    当我们的数据被加密,或者我们忘记了密码,就需要使用破解工具来从数据中获取信息,这就是一种常见的安全测试方法,也是正确操作的情况下找回密码的方法。 在本文中,我们将重点讨论Python暴力破解Mysql数据的示例。这是一种非常流行的安全测试方法,许多黑客和安全专家都使用它来测试他们的Mysql数据安全性。 下面是Python对Mysql数据库进行暴力破解的示例…

    python 2023年6月3日
    00
  • Python搭建Gitee图床的示例代码

    下面具体讲解一下Python搭建Gitee图床的示例代码的完整攻略,包含以下几个步骤: 步骤一:创建Gitee账号和仓库 在Gitee官网上注册账号并登录,然后创建一个新的仓库,用于存放我们将要上传的图片。记住仓库地址、用户名和密码,后面要用到。 步骤二:安装Python及必要的第三方库 如果你还没有安装Python,需要先去官网下载并安装Python3,然…

    python 2023年6月2日
    00
  • 搞懂Python正则表达式,这一篇就够了

    本文代码基于Python3.11解释器,除了第一次示例,代码将省略 import re 这个语句 所有示例代码均可以在我的github仓库中的 code.py文件内查看 [我的仓库](PythonLearinig/正则表达式 at main · saopigqwq233/PythonLearinig (github.com)) 搞清楚Python正则表达式语…

    python 2023年4月27日
    00
  • Python3 shutil(高级文件操作模块)实例用法总结

    下面是详细讲解 “Python3 shutil(高级文件操作模块)实例用法总结”的攻略: 1. shutil模块简介 shutil是Python标准库中的一个高级文件操作模块,它在os模块的基础上进行了封装,并提供了更多的文件操作方法。它支持高层次的文件操作,例如复制、移动、删除文件和目录等等。 shutil模块中的函数主要有以下几种类型: 复制文件和目录函…

    python 2023年5月13日
    00
  • python实现线性回归的示例代码

    当我们需要对某个数据集进行分类或者回归时,线性回归是一个常用的机器学习方法。在Python中,我们可以使用scikit-learn库实现线性回归。接下来,将从以下几方面介绍Python实现线性回归的攻略: 数据准备 将数据拆分为训练集和测试集 使用线性回归模型拟合数据 使用测试集评估模型表现 示例代码 1. 数据准备 在使用线性回归进行机器学习之前,我们首先…

    python 2023年5月19日
    00
  • Python Django:将转储数据用于具有 m2m 字段和 mySql 的单个模型

    【问题标题】:Python Django: Use dumpdata for single model with m2m field and mySqlPython Django:将转储数据用于具有 m2m 字段和 mySql 的单个模型 【发布时间】:2023-04-04 11:42:01 【问题描述】: 我有一个模型 Lecture,其中包含一些 m2m…

    Python开发 2023年4月6日
    00
  • Python cookbook(字符串与文本)在字符串的开头或结尾处进行文本匹配操作

    在进行字符串处理时,常常需要对字符串的开头或结尾进行文本匹配操作。在Python中,可以使用如下方式进行实现。 方法一:字符串的开头或结尾使用startswith()和endswith()方法 Python中的字符串对象提供有startswith()和endswith()方法,分别用于判断字符串是否以指定的前缀或后缀开头或结尾。例如: text = ‘Hel…

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