深入理解python中函数传递参数是值传递还是引用传递

深入理解Python中函数传递参数是值传递还是引用传递是一个常见的问题。在Python中,可以说参数传递并非严格意义上的值传递或引用传递,而是一种比较特殊的“对象引用传递”。

Python中的参数传递

Python中的“对象引用传递”是指:在函数调用时,参数传递进去的是引用,而不是变量的值。当变量是不可变对象(如number、string、tuple)时,因为无法修改其值,所以本质上相当于值传递;而当变量是可变对象(如list、set、dictionary)时,因为可以修改其值,所以本质上相当于引用传递。下面通过两个示例来具体说明:

示例一:不可变对象(值传递)

def func1(a):
    print('函数内开始:', a, id(a))
    a += 5
    print('函数内结束:', a, id(a))

b = 10
print('函数调用前:', b, id(b))
func1(b)
print('函数调用后:', b, id(b))

在这个示例中,我们将一个数字10传递给了函数func1。当函数中尝试修改a的值时,我们可以发现:函数内部的a和函数外部的b指向的id是不同的。即使在函数内部将a重新赋予了一个新值,函数外部的b的值也不会跟着变化。因此我们可以认为,当传入函数的参数是不可变对象时,Python传递的是值(通过引用来传递)。

示例二:可变对象(引用传递)

def func2(a):
    print('函数内开始:', a, id(a))
    a[0] = 5
    print('函数内结束:', a, id(a))

b = [1, 2, 3]
print('函数调用前:', b, id(b))
func2(b)
print('函数调用后:', b, id(b))

在这个示例中,我们将一个列表[1, 2, 3]传递给了函数func2。当函数中修改列表中的元素时,我们可以发现:函数内部的a和函数外部的b指向的id是一致的,即它们指向同一块内存空间。因此,当传入函数的参数是可变对象时,Python传递的是引用(通过引用来传递)。

总结

在Python中,对于不可变对象而言,传递的是值(通过引用传递),而对于可变对象而言,传递的是引用(通过引用传递)。但尽管如此,我们仍然可以对不可变对象进行修改,例如利用a += 5来修改数值类型的对象a。这实质上是将a重新赋值给了一个新的值,因此并未修改原有对象的值。因此,我们应该视情况而定,理解Python的“对象引用传递”机制,在编写代码时选择正确的传参方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入理解python中函数传递参数是值传递还是引用传递 - Python技术站

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

相关文章

  • python&MongoDB爬取图书馆借阅记录

    在本攻略中,我们将介绍如何使用Python和MongoDB爬取图书馆借阅记录。我们将使用requests库和BeautifulSoup库来爬取网页数据,并使用pymongo库将数据存储到MongoDB数据库中。 以下是完整攻略包括两个示例。 步骤1:安装必要的库 在开始之前,我们需要安装必要的库。我们可以使用以下命令来安装这些库: pip install r…

    python 2023年5月15日
    00
  • python2 与 pyhton3的输入语句写法小结

    Python2和Python3的输入语句写法有所不同,在此为大家总结一下: 在Python2中,输入语句的写法为: a = input(‘请输入一个数字:’) 在Python3中,输入语句的写法为: a = input(‘请输入一个数字:’) 可以看到,Python2中使用的是raw_input(),而Python3中使用的是input()函数。与此同时,P…

    python 2023年6月5日
    00
  • pytorch中函数tensor.numpy()的数据类型解析

    PyTorch是一个开源的机器学习框架,其中的Tensor是其核心数据类型。Tensor由数据及其相关的操作方法构成,可以理解为多维数组。在Tensor中,我们往往需要对数据进行操作和分析,而函数tensor.numpy()就是将Tensor数据类型转换为numpy的多维数组数据类型。 使用tensor.numpy()函数的步骤 使用tensor.numpy…

    python 2023年6月3日
    00
  • Python3用tkinter和PIL实现看图工具

    下面我将为你详细讲解“Python3用tkinter和PIL实现看图工具”的完整攻略。在实现这一看图工具过程中,我们需要借助两个Python库:tkinter和PIL。tkinter是Python中的标准GUI库,用于创建窗口和控件。而PIL(Python Imaging Library)则是Python的图像处理库,可以用于创建、打开、保存和编辑许多不同格…

    python 2023年6月13日
    00
  • Python基于百度AI实现抓取表情包

    Python基于百度AI实现抓取表情包是一个非常有用的应用场景,可以帮助我们在Python中快速抓取表情包。本攻略将介绍Python基于百度AI实现抓取表情包的完整攻略,包括数据获取、数据处理、数据存储和示例。 步骤1:获取数据 在Python中,我们可以使用requests库获取网页数据。以下是表情包页面数据的示例: import requests url…

    python 2023年5月15日
    00
  • 详解Python 序列化Serialize 和 反序列化Deserialize

    详解Python 序列化Serialize 和 反序列化Deserialize 序列化(Serialization)是将数据结构或对象状态转换为可以存储或传输的格式的过程。在网络传输、数据存储和编程中经常会使用序列化。Python提供了可以方便地序列化和反序列化数据的标准库模块。 序列化 Python常用的序列化方式有两种:pickle和json。 Pick…

    python 2023年6月2日
    00
  • python爬虫添加请求头代码实例

    Python爬虫添加请求头是提高爬虫稳定性和防封IP的一种方式。实现添加请求头的方法可以有多种,下面将为大家介绍一种比较简单直观的方法。 添加请求头的代码实现 import requests # 创建headers字典,内容可以根据实际情况酌情修改 headers = { ‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0…

    python 2023年6月3日
    00
  • Python入门教程(二十)Python的Lambda表达式

    下面是详细的Python入门教程(二十)Python的Lambda表达式完整攻略。 什么是Lambda表达式 Lambda表达式,也称为匿名函数,是一种简洁、快速、内联定义函数的方法。Lambda表达式可以代替一些不必要的函数定义,使代码更加简洁易读。 Lambda表达式的语法结构如下: lambda argument_list: expression 其中…

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