python中函数的参数传递(传值还是传引用)

函数的参数传递

函数参数传递有两种方式,传值和传引用,传值只是把变量的值复制一份给了实参,函数内部的操作不会改变函数外部变量的值,而传引用传递的是外部变量的地址,函数内部直接操作函数外部变量的储存空间,在调用函数之后,函数外部变量的值一般会改变

def Demo(a):a = a + 1print(id(a))if __name__ == '__main__':a = 3print(id(a)) # 140705335465056Demo(a) # 140705335465088print(id(a)) # 140705335465056

看到变量a在函数调用前后地址值没有改变,证明在传递数值时传递的是变量的值,字符等类型也一样,然后尝试列表,元组

def Demo(a):a.append(3)print(id(a))if __name__ == '__main__':s = [1,2]print("value = " + str(s) + "address = " + str(id(s)))  # value = [1, 2]address = 1574898786888Demo(s)  # value = [1, 2, 3]address = 1574898786888print("value = " + str(s) + "address = " + str(id(s)))  # value = [1, 2, 3]address = 1574898786888

函数调用前后地址值一致,证明传递的是引用,并且函数执行以后a的值也发生了改变,说明a.append()是在s的内存中操作的

如果传递的是元组,应为元组不可修改,所以三次输出的都是同一块地址,但其实以元组为参数传递时传递的是值。

还有一种情况

def Demo(a):a[0].append(3)print("value = " + str(a) + "address = " + str(id(a)))if __name__ == '__main__':a = ([1,2], 2)print("value = " + str(a) + "address = " + str(id(a)))  # value = ([1, 2], 2)address = 2616967970056Demo(a)  # value = ([1, 2, 3], 2)address = 2616967970056print("value = " + str(a) + "address = " + str(id(a)))  # value = ([1, 2, 3], 2)address = 2616967970056

如果元组中的元素是列表,在调用函数前后,函数外部的a也发生了变化,根据刚开始说的,这感觉是在传引用,但其实不是,对于函数外部的a来说,他的第0个元素始终是<class 'list'>,至于列表中元素有没有发生变化,元组并不关心,元组判断元素有没有改变判断的是元素的地址有没有改变,而调用append()函数时,传递的是可变元素列表,地址值不会发生改变,这也就是为什么元组不可变,但如果元组中的数据是可变类型的话该数据就可变的原因

总结

python有两种数据类型,可变和不可变数据,对于可变数据类型,诸如列表,字典,集合在函数传参时传引用,对于不可变数据类型,如数值,字符,元组,在函数传参时传值,但更准确的来说,python函数传参时使用传对象引用的方式,如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“传引用”来传递对象。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象--相当于通过“传值’来传递对象。

最后还是要注意像元组中数据是可变类型的情况

参考链接1
参考链接2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457616.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

poi获取有效单元格个数_EXCEL利用SUM函数和FREQUENCY函数数组公式统计不同区间数据个数...

EXCEL函数公式大全之利用FREQUENCY函数数组公式统计不同区间数据个数。EXCEL函数与公式在工作中使用非常的频繁&#xff0c;会不会使用公式直接决定了我们的工作效率&#xff0c;今天我们来学习一下提高我们工作效率的函数FREQUENCY函数和数组公式。今天我们的例子是统计学生在…

windows安装rsync

客户端&#xff1a;cwRsync 4.0.5 Installer服务端&#xff1a;cwRsyncServer 4.0.5 Installer 安装配置Rsync服务端 1.直接双击安装包安装即可&#xff0c;在安装过程中会有要求用户输入账户密码或者使用默认。此账户是rsync服务运行的用户。 2.安装完成之后&#xff0c;进入程…

洛谷 P2735 电网 Electric Fences Label:计算几何--皮克定理

题目描述 在本题中&#xff0c;格点是指横纵坐标皆为整数的点。 为了圈养他的牛&#xff0c;农夫约翰&#xff08;Farmer John)建造了一个三角形的电网。他从原点&#xff08;0,0&#xff09;牵出一根通电的电线&#xff0c;连接格点(n,m)&#xff08;0<n<32000,0<m&l…

Python元类(type()和metaclass)

1. 元类是什么 众所周知&#xff0c;对象由类实例化而来&#xff0c;类是对象的模板&#xff0c;而python一切皆对象&#xff0c;类也是对象&#xff0c;它由元类&#xff08;type&#xff09;创建&#xff0c;所以元类是类的类&#xff0c;是类的模板 2. 创建类的另一种方法…

word文档打印 自动编码_办公室文件打印有哪些技巧 办公室文件打印技巧介绍【图文】...

办公室文件打印实用技巧三则一. 打印文件直接装订——逆序打印相信使用Word打印过长篇文档的朋友一定都清楚&#xff0c;打印完成后的装订一直是个麻烦事儿&#xff0c;因为文件由打印机打出时&#xff0c;第一页肯定会在最下面&#xff0c;装订之前总要费时费力的把纸张按顺序…

Strategy 策略模式

意图 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。 动机 策略模式为了适应不同的需求&#xff0c;只把变化点封装了&#xff0c;这个变化点就是实现不同需求的算法&#xff0c;但是&#xff0c;用户需要知道各种…

python 消息中间件_消息队列中间件 RabbitMQ 详细介绍——安装与基本应用(Python)...

RabbitMQ 是当前最流行的消息中间件(Message Broker)之一&#xff0c;支持多种消息协议(如 AMQP、MQTT)。同时它也是一个轻量级的非常易于部署的开源软件&#xff0c;可以运行在当前大多数操作系统及云端环境中&#xff0c;也能够部署在分布式的集群环境里以达到高可用、可伸缩…

用 Flask 来写个轻博客 (1) — 创建项目

目录 目录前言扩展阅读部署开发环境创建 Github 项目前言 一步一步的实现一个 Flask 轻博客项目启动&#xff0c;最新的代码会上传到 Github。 扩展阅读 欢迎使用 Flask — virtualenv 部署开发环境 连接 GitHubhostnamectl set-hostname flask-dev # 设置 hostname ssh-keyg…

python静态方法,类方法,属性方法,实例方法

DAY 3. 静态方法&#xff0c;类方法&#xff0c;属性方法&#xff0c;实例方法 有四种方法&#xff0c;实例方法&#xff0c;类方法&#xff0c;静态方法&#xff0c;属性方法 实例方法 实例方法的第一个参数是self&#xff0c;他会指向类的实例化对象&#xff0c;只能被对象…

ubuntu 软件包降级

ubuntu 软件包降级 sudo aptitude install libssl-dev 1. 是否接受该解决方案&#xff1f; [Y/n/?] n 2. 是否接受该解决方案&#xff1f; [Y/n/?] y 3. 您要继续吗&#xff1f; [Y/n/?] ysudo aptitude install libcairo21.4.10-1ubuntu4 # 强制降级 sudo aptitude forbid…

java后期发展方向_Java程序员的4个职业发展方向,该如何把握黄金5年?

在Java程序界流行着一种默认的说法叫“黄金5年”&#xff0c;意思是说&#xff0c;一个Java程序员从入职的时候算起&#xff0c;前五年我选择直接影响着整个职业生涯的发展方向和薪资走向。而这5年&#xff0c;也决定了一个程序员能否成为职业大牛的可能。那么&#xff0c;在这…

python 类变量(属性)和实例变量(属性

DAY 4. 类变量&#xff08;属性&#xff09;和实例变量&#xff08;属性&#xff09; 类变量&#xff1a;在所有类的实例之间都可以共享的变量&#xff0c;类变量在所有对象间只保留一份 在类体中定义类的所有实例对象都可以访问类变量类变量只能由类修改&#xff0c;实例对象…

MySQL 关联表批量修改(数据同步)

update table1 t1 ,table2 t2 set t1.field1 t2.field2 where t1.id t2.id 转载于:https://www.cnblogs.com/52php/p/5677908.html

sourcetree不好做到的一些git操作

2019独角兽企业重金招聘Python工程师标准>>> 日常中我们有很多操作通过sourcetree就可以实现界面化操作&#xff0c;但是有一些场景不好去实现&#xff0c;这里总结下&#xff1a; 场景1&#xff1a;我们有个A分支&#xff0c;需要跟master分支合并等待上线&#xf…

vue大括号里接受一个函数_vue源码探究(第四弹)

vue源码探究&#xff08;第四弹&#xff09;结束了上一part的数据代理&#xff0c;这一部分主要讲讲vue的模板解析&#xff0c;感觉这个有点难理解&#xff0c;而且内容有点多&#xff0c;hhh。模板解析废话不多说&#xff0c;先从简单的入手。按照之前的套路&#xff0c;先举一…

类级别的分装 ---四种访问级别

privateprivate成员为类的私有性质&#xff0c;仅有类本身和友元可以访问&#xff1b;protected和private类似&#xff0c;区别于protected可以被该类所有派生类访问&#xff1b;publicpublic的成员可以被外界的所有客户代码直接访问published和public的区别仅在于published的成…

python自省与反射

DAY 5. python自省 这是很久之前写的&#xff0c;当时对自省和反射的概念没理解&#xff0c;学习Java以后多了一点理解&#xff0c;自省是获取对象的能力&#xff0c;反射是操纵对象的能力&#xff0c;python中使用getattr()和setattr()实现反射&#xff0c;而其他的则是自省&…

vb.net 窗体接收键盘事件_(十五)C#WinFrom自定义控件系列-键盘(二)

前提入行已经7,8年了&#xff0c;一直想做一套漂亮点的自定义控件&#xff0c;于是就有了本系列文章。本系列文章将讲解各种控件的开发及思路&#xff0c;欢迎各位批评指正。此系列控件开发教程将全部在原生控件基础上进行重绘开发&#xff0c;目标的扁平化、漂亮、支持触屏。如…

centos下cmake安装

步骤一、安装gcc等必备程序包&#xff08;已安装则略过此步&#xff0c;用gcc -v检测&#xff09; yum install -y gcc gcc-c make automake 步骤二、安装wget &#xff08;已安装则略过此步&#xff09; yum install -y wget 步骤三、获取CMake源码包 wget http://www.cmake.…

python 生成式,迭代器,生成器

DAY 6. 生成式,迭代器&#xff0c;生成器 6.1 生成式 6.1.1 列表生成式 list [index for index in range(10)]6.1.2 字典生成式 dict {zhangsan: 10,lisi: 12,wangwu: 18 } # 实现键值互换 dict {k:v for v,k in dict.items() if k > 12}6.1.3 集合生成式 # 100以内…