iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python基础之值传递和引用传递详解
  • 813
分享到

Python基础之值传递和引用传递详解

Python值传递 引用传递Python值传递Python 引用传递 2023-05-18 17:05:35 813人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录什么是值传递和引用传递可以干预参数传递是值传递还是引用传递么探寻一下值传递底层是如何实现的总结在python中,向函数传递参数的类型有两种,一种是值传递,还有一种是引用传递,如果

python中,向函数传递参数的类型有两种,一种是值传递,还有一种是引用传递,如果你恰恰好会一点c基础,你可以理解为前者为传递形参,而后者传递指针。本篇文章将探究Python的值传递和引用传递。

文本所依赖的python环境为:

什么是值传递和引用传递

值传递,我们可以理解为传递了一个副本过去,即变量的拷贝,修改副本值不会影响原先的值,例如:

def modify_x(x):
    x = 99
    print("函数中修改过后的值: " , x)
    
x=66
modify_x(x)
print("执行modify_x函数后的值:" , x)

在上述代码中,我们定义了一个变量x,并赋值为66,而后将x传入其modify_x函数中,在函数中,我们将x赋值为99,打印一下函数中的x值,函数结果。 在主函数中再打印一下x的值。

此结果执行后如下:

如上代码,我们传入的是形参,在函数中修改形参是不会改变原先的值的,这是因为函数运行时候会先进行压栈,运行过程中会产线局部信息等,恰恰好,我们传入的形参就是该类型的值,所以运行后会出栈,出栈后函数所在的内存也会被销毁,所以函数内的局部变量随着出栈也被销毁了。所以直接修改形参无效。

以上这个就是值传递。

那什么是引用传递呢?我们还是拿上面这个例子做比方,只不过传递的类型换一下,从数值类型更换为字典类型,如:

def modify_x(dict):
    dict["x"] = 99
    print("数中修改过后的值:" , dict)

a={
    "x":66
}
modify_x(a)
print("执行modify_x函数后的值:", a)

如上代码,我们定义了一个字典a,该字典有一个keyx,值为66。在调用modify_x函数中,我们将a传递给了函数,在函数中,我们将该字典keyx的赋值为99,函数结束,在主函数中打印a的值。

执行后结果如下:

是不是感觉很诧异,同样的代码,为什么传递整形 和 传递 字典 , 所执行的效果不一样呢? 这是因为python机制就是如此,它在传递该值的时候,使用的是指针传递,所以值没有改变,我们将其称之为引用传递。

可以干预参数传递是值传递还是引用传递么

python不可以干预参数传递的类型,因为python不像cc++一样,可以传递形参,也可以传递指针类型。

python中,参数传递是由解释器实现的,所以说,普通开发者,没办法直接干预参数传递方式,但是可以曲线救国,善用return就是其中一条,例如我们将最开始的代码修改一下,不直接修改值,而是返回一个新的值,例如:

def modify_x(x):
    x = 99
    return x

x = 66
x = modify_x(x)
print("执行modify_x函数后的值:" , x)

我们执行后,结果为:

这并不是修改x的值,而是接收modify_x传递回来的新值。

探寻一下值传递底层是如何实现的

我们之前所述的值传递,都是对数据的拷贝,可是现实真的如此么? 我们可以写一个案例来看下:

def modify_x(x):
    print("函数中:",id(x))

x = 123
print("函数外:",id(x))
modify_x(x)

在上述代码中,有一个新的知识点是方法id,它可以查看变量的内存地址。在上述例子中,在主函数中定义一个整形x,值为123,在传递给函数前,使用id方法查看一下变量的内存地址。而后传递给函数modify_x,在该函数中,也使用id方法来查看一下形参x的地址。

若真如我们所猜想,那么2个内存地址应该不一致才对,我们运行下程序:

发现函数内,和函数外的地址都是一样的? 哎,这是怎么回事呢?

这是因为在python中,解释器为了优化性能,避免大量无用数据拷贝,所以在传递的时候,一开始全是传递的实参,只有当函数内修改了值后,才会新申请一个内存来存该值。细节可以查看这个例子:

def modify_x(x) :
    print("函数中1:",id(x))
    x = 456
    print("函数中2:",id(x))

x=123
print("函数外0:",id(x))
modify_x(x)

上述代码,我们在modify_x函数中,修改变量x前后都打印其内存地址,结果如下:

我们发现,在未修改之前,地址内存都是指向同一个地址,修改之后,内存地址也变了。

如果我们将x更换为引用传递的数据的话,就不会出现以下这种情况,可以看下面这个例子:

def modify x(x) :
    print("函数中1:",id(x))
    x[0] = 456
    print("函数中2:",id(x))

x = [123]
print("函数外0:",id(x))
modify_x(x)
print("最后的值:" , x)

上述代码,我们做了一个小小的改动,我们将整形数据x,更改为了列表类型,最后再打印一下x的值,查看变了没有,代码运行结果如下:

发现内存地址的值并没有改变,且x的值在函数中真的被修改了。

所以通过上述例子,可以说明,值传递的时候,再没有修改的时候,该变量地址还是指向原来的地址,当值被修改后,就会开辟一个新的内存地址用于存储该值。这样的话可以避免拷贝大量数据。

最后再总结一下,哪些类型是引用传递,哪些类型是值传递:

引用传递分别有 列表、字典、集合、自定义类实例等。

值传递分别有 字符串类型、元组、布尔类型、数值类型等。

总结

本篇文章简单介绍了值传递和引用传递,值传递,修改函数内值后,不会影响原始值,而引用传递,修改函数内值后,会印象到原始数据。不过有一个小细节,就是值传递,若不进行修改值的时候,其实内存地址是指向的原始值的地址,当修改值的时候,才会真正申请内存来存储修改的值,但是随着函数出栈,该函数内的数据局部变量,也会被销毁。

到此这篇关于Python基础之值传递和引用传递详解的文章就介绍到这了,更多相关Python值传递 引用传递内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python基础之值传递和引用传递详解

本文链接: https://www.lsjlt.com/news/212322.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python基础之值传递和引用传递详解
    目录什么是值传递和引用传递可以干预参数传递是值传递还是引用传递么探寻一下值传递底层是如何实现的总结在python中,向函数传递参数的类型有两种,一种是值传递,还有一种是引用传递,如果...
    99+
    2023-05-18
    Python值传递 引用传递 Python值传递 Python 引用传递
  • C++之值传递&指针传递&引用传递的示例详解
    目录1.函数基础2.值传递3.指针传递4.引用传递1.函数基础 一个函数由以下四部分组成: 返回类型函数名参数(0个或多个)函数体 其中,函数的参数叫做形参,函数执行的操作的语句块叫...
    99+
    2022-11-13
    C++值传递 指针传递 引用传递 C++ 值传递 C++ 指针传递 C++ 引用传递
  • 详解java的值传递、地址传递、引用传递
    详解java的值传递、地址传递、引用传递一直来觉得对值传递和地址传递了解的很清楚,刚才在开源中国上看到一篇帖子介绍了java中的值传递和地址传递,看完后感受颇深。下边总结下以便更容易理解。按照以前的理解,java中基本数据类型是值传递,对象...
    99+
    2023-05-31
    java 值传递 地址传递
  • 带你详细了解Java值传递和引用传递
    目录1、什么是值传递,什么是引用传递?2、值传递和引用传递的区别是什么?3、Java中只有值传递3.1 纠正一下大家以前的那些错误看法3.2求值策略3.3 严格求值3.3 java ...
    99+
    2022-11-12
  • Java中的值传递和引用传递
    Java中的值传递和引用传递 基本概念 值传递: 传递对象的一个副本,即使副本被改变,也不会影响源对象,因为值传递的时候,实际上是将实参的值复制一份给形参。 引用传递: 传递的并不是实际的对象,而是对...
    99+
    2023-09-15
    java 开发语言 jvm
  • python值传递和引用传递有什么不同
    在Python中,变量的传递方式既不是纯粹的值传递,也不是纯粹的引用传递,而是一种称为"对象的引用传递"的方式。值传递是指在函数调用...
    99+
    2023-09-23
    python
  • 全面理解Java中的引用传递和值传递
    目录1.基本类型和引用类型在内存中的保存2.变量的基本类型和引用类型的区别3.引用传递和值传递4.结论关于Java传参时是引用传递还是值传递,是一个讨论比较多的话题, 有说Java中...
    99+
    2022-11-12
  • C语言值传递和地址传递详解
    目录一. 值传递二.地址传递总结一. 值传递 我们举一个例子: 写一个函数找出两个整数中的最大值。 #include<stdio.h> //get_max函数 int ...
    99+
    2022-11-13
  • 深入理解python中函数传递参数是值传递还是引用传递
    目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用。Python参数传递采用的肯定是“传对象引用”的方式。实际上,这种方式相当于传值和传引用的一种综合。如果函数收到的是...
    99+
    2022-06-04
    函数 参数 python
  • 这一次,彻底解决Java的值传递和引用传递
    本文旨在用最通俗的语言讲述最枯燥的基本知识学过Java基础的人都知道:值传递和引用传递是初次接触Java时的一个难点,有时候记得了语法却记不得怎么实际运用,有时候会的了运用却解释不出原理,而且坊间讨论的话题又是充满争议:有的论坛帖子说Jav...
    99+
    2023-06-02
  • JavaScript中值传递和引用传递有什么区别
    JavaScript中值传递和引用传递有什么区别?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。JavaScript是什么JavaScript是一种直译式的脚本语言,其解释器被称...
    99+
    2023-06-14
  • Java中值传递和引用传递的示例分析
    小编给大家分享一下Java中值传递和引用传递的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、前言最近在看Java核心卷一,也就是这本书:在这本书里面也...
    99+
    2023-06-15
  • 怎么在Java中实现值传递和引用传递
    怎么在Java中实现值传递和引用传递?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了...
    99+
    2023-06-14
  • java中值传递和引用传递有哪些区别
    这篇“java中值传递和引用传递有哪些区别”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“java中值传递和引用传递有哪些区别...
    99+
    2023-07-04
  • Js值传递和引用传递的不同点有哪些
    本篇内容介绍了“Js值传递和引用传递的不同点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!概念不同值传递为单向传递,只能由实参传递给形...
    99+
    2023-06-30
  • JS中值传递和引用传递的区别有哪些
    这篇文章主要介绍了JS中值传递和引用传递的区别有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。JS是什么JS是JavaScript的简称,它是一种直译式的脚本语言,其解释...
    99+
    2023-06-14
  • php按值传递和引用传递的区别是什么
    这篇文章主要讲解了“php按值传递和引用传递的区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php按值传递和引用传递的区别是什么”吧!说明按值传递中php必须复制值。特别是对于大型...
    99+
    2023-06-20
  • java中值传递和引用传递的区别是什么
    在Java中,值传递(pass by value)和引用传递(pass by reference)是两种不同的参数传递方式。值传递是...
    99+
    2023-08-14
    java
  • Python函数值传递引用传递及形式参数和实际参数的区别
    通常情况下,定义函数时都会选择有参数的函数形式,函数参数的作用是传递数据给函数,令其对接收的数据做具体的操作处理。 在使用函数时,经常会用到形式参数(简称“形参&rdqu...
    99+
    2022-11-11
  • python3 学习笔记之引用传递和引用
    python中所谓的pass-by-reference(引用传递)和pass-by-value(值传递)。是由于名字是不是内存符号造成的。如果变量不包括名字所关联的目标对象,那么就是值传递。因为此时传递是通过复制名字关联来实现的。类似于指...
    99+
    2023-01-31
    学习笔记
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作