python传值机制

Python参数的传递 函数的参数传递本质上就是:从实参到形参的赋值操作。Python中“一切皆对象”,所有的赋值操作都是“引用的赋值”。所以,Python中参数的传递都是“引用传递”,不是“值传递”。字典、列表、集合、自定义的对象等数字、字符串、元组、function等。 阅读详情

首先要明确的是:Python参数传递采用的 都是按引用传递。
那么,有人就会有 疑惑:为什么数字,字符串,元组的等看起开好像是类似于C语言的按值传递, 而list,dict又像是C++的引用传递呢?

我认为,这是因为:python中有可变对象和不可变对象之分。

对可变对象都来说,就好象是按引用传递,对不可变对象来说,就好象是按值传递。我们还是来弄清到底为什么是这个现象。


#!/usr/bin/env python3
#-*-coding:utf-8-*-

x = 5

def test(x):
    print('函数里的x变量的最初地址是:',id(x))
    x+=1
    print("加1操作后,函数里的x变量的值是:", x)
    print('加1操作后,函数里变量x的地址是:',id(x))



if __name__=='__main__':
    print('最开始x的地址是:',id(x))
    test(x)
    print('最后,函数外x变量的值是:',x)




运行结果:

>>>
最开始x的地址是:                          1619120656
函数里的x变量的最初地址是:        1619120656
加1操作后,函数里的x变量的值是: 6
加1操作后,函数里变量x的地址是: 1619120672
最后,函数外x变量的值是:             5

我们发现,最开始x的地址  和   函数里的x变量的最初地址是一样 的,说明传递的的确是引用。也就是函数里的局部变量x和函数外的全局变量x都引用同一个对象 5 。问题是:当函数里的变量x进行+1操作后,x引用的地址变了,说明:x不再引用对象 5,而是重新引用了临时对象 6.。那么为什么python不让原来地址为1619120656的整数5在原地变为6,而是另外临时创建一个整型对象6,再让函数里的 x去引用?这就是因为:int 类 对象是不可变对象。


也即是说:在地址为:1619120656的这个数据不可更改,只读不可写。

画个图

当函数调用完毕,局部变量就会被销毁,相当于del x ,内存对象 6 没有被任何变量引用,就会被垃圾回收。也就是在内存上被清理。全局变量x最终还是引用对象5,没有任何改变。python之所以这样设计,我想是考虑到代码的安全和管理。因为数字,字符串等类型是最常用的,如果代码里有n处同时引用了一个数字,其中有1处操作将此数字改变了,n-1处也不会改变,这确实是一件好事。


那么对于可变对象,大家应引申一下就明白了。由于是可变对象,只要在某一处通过某个操作被改变,那n-1处也就会随之更新。

。




最后,看看ython的内存管理:

Python中的每个对象都有一个引用计数,用来计数该对象在不同场所分别被引用了多少次。每当引用一次Python对象,相应的引用计数就增1,每当消毁一次Python对象,则相应的引用就减1,只有当引用计数为零时,才真正从内存中删除Python对象,也就是垃圾回收。


还要说明的一点是:既然python中,一切皆对象,那么,在使用数据对象时,除了字面值外,一切皆引用。

因为python的变量本身不含数据,那么,在使用对象时,就只能靠变量去引用对象。然后再操作变量,达到操作数据对象的目的。

python 类传值的两种方法 阅读详情

相关推荐

python Qt5GUI界面主窗口和子窗口相互传值,保证能用

python Qt5GUI界面主窗口和子窗口相互传值,保证能用。。。。。。。。。。。。。!

【python基础】函数-值传递

不可变数据类型的实参变量,经过函数操作之后,不会改变其原有内容可变数据类型的实参变量,经过函数操作之后,会改变其原有内容。

2301_78287784的博客 1179

07- Rossmann商店销售预测 (Xgboost集成算法) (项目七)

Rossmann在欧洲国家经营着3000多家日化用品超市。目前,Rossmann商店经理的任务是提前6周预测他们的日销售额。商店的销售受到许多因素的影响,包括促销、竞争、学校和国家假日、季节性和地域性。由于数以千计的管理者根据自己的特殊情况预测销售,结果的准确性可能会有很大的差异。 因此使用机器学习算法对销量进行预测,Rossmann要求预测德国1115家商店的6周日销售额。可靠的销售预测使商店经理能够制定有效的员工时间表,提高生产力和积极性。

March_A的博客 2462

一文读懂 Python 值传递和引用传递

在编程语言中,值传递(pass by value)和引用传递(pass by reference)是两个重要的概念。

pythonhy的博客 2533

帆软报表JS导出避坑指南:如何正确处理sessionid和参数传递

本文深入探讨了帆软报表中通过JavaScript实现一键导出的关键技术,重点解析了如何正确获取并传递sessionid以确保会话不丢失,以及如何构造包含必要参数的导出URL。文章详细对比了预览后导出与直接URL导出两种方式的差异,并提供了从参数拼接、前端触发下载到高级场景(如SPA集成)的完整避坑指南,帮助开发者构建稳定可靠的自定义导出功能。

weixin_42522857的博客 163

Python CalmAn(Calcium Imaging Analysis)神经生物学工具包安装及环境配置过程

CalmAn是一个用于大规模钙成像数据分析和行为分析的Python工具箱。CaImAn实施了大规模钙成像数据分析管道中所需的一套基本方法。针对多天的运动校正、源提取、尖峰反褶积和分量配准,实现了快速且可扩展的算法。它适用于双光子和单光子荧光显微镜数据,可以在批处理和在线模式下运行;CaImAn还包含一些分析摄像机行为的例程。

Fine的优快云博客 3559

深入理解 Python 中的函数参数传递机制

函数是 Python 编程的基础之一,掌握 Python 函数的各种特性和用法对我们的编程技能提升非常重要。通过本篇文章,我们对 Python 函数的基本概念和用法进行了回顾,并学习了 Python 中一些更高级的函数特性和用法,包括默认参数、可变参数、lambda 表达式、高阶函数等等。希望这些内容对你有所帮助,祝你在 Python 编程的道路上越走越远。

小小张说故事的博客 2357

Qt界面美化-飞扬青云自绘控件插件的使用-避免采坑

1、先上一个集成到QtCreater中的效果图: 2、飞扬青云自绘控件插件下载地址:https://gitcode.net/mirrors/feiyangqingyun/qucsdk?utm_source=csdn_github_accelerator 3、集成插件到QtCreater中的方法: (1)、查看自己使用的QtCreater的版本信息,我的:Qt 5.15.2 MSVC2019 64位 (2)插件下载下来后工程预览: 我选择msvc版本的SDK,打开找到匹配的SDK:...

小米的修行之路 2793

python传值机制:传值or传引用?

通过id函数,直接看到变量的地址,探讨python的传值机制,并给出部分的注意点及解决方案。

Gao_HongXiang 429

YOLOv13改进策略【特征提取层】| 引入注意力卷积模块RFAConv,关注感受野空间特征 助力yolov13精度提升

RFAConv:创新空间注意力和标准卷积运算感受野空间特征是针对卷积核设计的,根据卷积核大小动态生成。以3×3卷积核为例,它由非重叠滑动窗口组成,每个窗口代表一个感受野滑块。

Limiiiing的博客 363

华为MetaERP国资委语境下的 DRP(全域数字化资源管理平台/Digitalized Resource-management Platform)与传统 ERP(以 SAP、Oracle 为代表)的

【摘要】国资委推动的DRP(全域数字化资源管理平台)正在重构央国企数智化转型路径,其本质是通过"ERP管交易+DRP管管控"的双层架构实现升维替代。与传统ERP相比,DRP具有三大突破:采用国产分布式数据库实现全级次穿透监管、构建数据中台打破信息孤岛、以实时分析替代事后报表。当前政策明确2026-2030年分阶段建设目标,这将重塑产业格局——倒逼传统ERP厂商转型,为云原生/AI/信创企业创造新机遇。需注意DRP并非简单替代ERP,而是通过治理模式变革实现"交易系统做薄、管控中

金牌架构师 291

python 传值 传引用_python传值机制:传值or传引用?

在C++/Java等语言中,都有传值(pass-by-value)、传引用(pass-by-reference)的概念,在C++中,这个概念区分的很清楚,通过&即可。本人相对而言也是对C++更加熟悉一些,最近需要用到python,在python究竟是传值还是传引用上踩了一下坑。其实,我发现,python与JavaScript在这个机制上是非常像的,对于JavaScript而言,如果是原子类...

weixin_39550379的博客 293

1000Base-T1协议解读(基于802.3bq-2016 和Test Suite)

1000Base-T1是由一对双绞线实现全双工传输的以太网标准,采用PAM3编码方式(-1,0,1),编码后的实际传输符号速率为750Mbps。该标准的车载最大传输距离可达15米,主要应用于汽车产品开发过程。测试过程示波器要求带宽≥2G,采样率≥7.5Gbps,网分带宽≥1G。

qflook的博客 5336

python 函数参数传递机制_Python参数传递机制传值和传引用原理详解

首先还是应该科普下函数参数传递机制,传值和传引用是什么意思?函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题。基本的参数传递机制有两种:值传递和引用传递。值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数...

weixin_35719180的博客 260

Qt(C++)使用QChart动态显示3个设备的温度变化曲线

Qt的QChart是一个用于绘制图表和可视化数据的类。提供了一个灵活的、可扩展的、跨平台的图表绘制解决方案,可以用于各种应用程序,如数据分析、科学计算、金融交易等。

1917

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

记住函数传参既不是传值也不是传引用

Python中函数传值到底是传值还是传引用呢?下面逐一讨论主流的3个观点:传引用、传值、可变对象传引用,不可变对象传值。 传引用 def inc(num): print(id(num)) num += 1 print(id(num)) num = 21 print(id(num)) # 1628139152 inc(num) # 1628139152 # 1628...

王山山 271

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

深入详解python传值问题及内存管理机制

python中到底是“传引用”还是“传值”呢???        这个问题的回答是:看情况。有的是传值,有的是传引用。        判断的依据是看对象的可变性,而这一点又取决于对象的类型。故在python中的说法是对象可变的还是不可变的。        基本数据类型(整型及其他数据类型,字符串)及元组是不可变的,参数传递的是形参,也就是传过来的是原值的一个拷贝,在函数中改变形参的值实参不会

zhangweijiqn的专栏 5714

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

python 按对象传值

今天研究了下Python中的传值问题: 1. 所有传递都是引用传递,形参与实参ID一样 2. 对于string int float bool等不可变类型,操作时会变为新的对象 3. 对于[] {}等可变类型,操作时还是引用的全局对像

努力搬砖,努力生活 1608

二维矩阵传参不会改变值_python函数是传参还是传引用?不,都不是!

python中函数的传参是传引用还是传值呢?相信很多人从c++转投python时都跟我有一样的困惑。实际上,python既不是传参也不是传引用。应该称其为传对象引用。代码永远是最好的讲解,show code!def inc(n): print(id(n)) n=n+1 print(id(n)) b=1 print(b) print(id(b)) inc(b) print(b...

weixin_39850152的博客 358

Python参数传递机制:到底是传值还是传引用?

参考链接:http://c.biancheng.net/view/2258.html def A(matrix, string): for i in range(len(matrix)): for j in range(len(matrix[i])): print(matrix[i][j]) print(string) def B(matrix, string): matrix[0][0] = 0 for i in range(len

qq_45766916的博客 485

python列表做参数传值_Python 函数中,参数是传值,还是传引用

匿名用户1级2017-10-26 回答这个问题的答案无外乎这几种说法:传值,传引用,对于可变对象是传引用,不可变对象是传值。传引用先看下面这个例子:>>> def foo(n):... print id(n)... n = 3... print id(n)>>> n = 2>>> id(n)310...

weixin_39531229的博客 409

python dict 字典 以及 赋值 引用的一些小实验

最近在做一个很大的数据库方面的东东,要用到根据数值来查找,于是想到了python中的字典,平时没用过dict这个东东 用的最多的还是 list 和 tuple (网上查 用法一大堆) 看了一下创建字典的方法: 方法1: dict = {'name': 'earth', 'port': 80} 方法2:  fdict = dict((['x', 1], ['y', 2])) 方

qwerty_xk的专栏 2万+

python中函数参数是引用还是传值

在《python核心编程》中看到:“python 是通过引用调用的,... ,但对不可变对象而言,函数的行为将类似按值传递”。但是我尝试编写以下函数,输出却不是如料想的: def func(x): x = x * 2 print "local x : " ,x ############# x = 1 func(x) print "global x : ", x 这段代码的

Virtual_Func的博客 825

传值or传引用?Python传的是对象——转自Python之禅

本文转自Python之禅,作者liuzhijun原文链接如下:https://foofish.net/python-function-args.html在 C/C++ 中,传值和传引用是函数参数传递的两种方式,在Python中参数是如何传递的?回答这个问题前,不如先来看两段代码。代码段1:def foo(arg): arg = 2 print(arg) a = 1 foo(a) ...

LucyGill的博客 447

R与Python变量传递机制全解密(从传值到共享内存的终极指南)

深入解析R-Python 的变量传递机制,揭示数据在两种语言间高效交互的核心原理。涵盖传值、引用与共享内存的适用场景及性能优势,提供跨语言协作的实用方法。掌握关键技巧,提升计算效率,值得收藏。

CompiGap的博客 648

函数传参_python函数是传参还是传引用?不,都不是!

python中函数的传参是传引用还是传值呢?相信很多人从c++转投python时都跟我有一样的困惑。实际上,python既不是传参也不是传引用。应该称其为传对象引用。代码永远是最好的讲解,show code!def inc(n): print(id(n)) n=n+1 print(id(n)) b=1 print(b) print(id(b)) inc(b) print(b...

weixin_39947908的博客 81
上一篇: python2与python3的区别
下一篇: python中的类,对象,方法,属性等介绍
love1code
博客等级 码龄12年 19粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值