函数的参数传递

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

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

python中函数的参数传递(传值还是传引用)相关推荐

  1. Go 学习笔记(65)— Go 中函数参数是传值还是传引用

    Go 语言中,函数参数传递采用是值传递的方式.所谓"值传递",就是将实际参数在内存中的表示逐位拷贝到形式参数中.对于像整型.数组.结构体这类类型,它们的内存表示就是它们自身的数据内 ...

  2. 【中级软考】函数参数传递传值与传引用的区别(global关键字,函数内定义全局变量)

    传值调用最显著的特征就是被调用的函数内部对形参的修改不影响实参的值. 引用调用是将实参的地址传递给形参,使得形参的地址就是实参的地址. (对于python而言,普通的实参传个变量(或常量)进去就相当于 ...

  3. Python中函数的参数传递与可变长参数

    1.Python中也有像C++一样的默认缺省函数 1 def foo(text,num=0): 2 print text,num 3 4 foo("asd") #asd 0 5 f ...

  4. python中函数的参数:必传参数(位置参数)、默认值参数、参数组传参、关键字传参...

    1.必传参数也叫做位置参数,因为必填,也必须对应位置 2.默认值参数如上图的word 3.参数组参数:传进去的是0个.或多个value的形式,,,和位置参数有点像,只传value值,但是没有限制个数 ...

  5. html绑定带有形参的函数,Python中函数参数类型和参数绑定

    参数类型 Python函数的参数类型一共有五种,分别是: POSITIONAL_OR_KEYWORD(位置参数或关键字参数) VAR_POSITIONAL(可变参数) KEYWORD_ONLY(关键字 ...

  6. 参数 中_Python中函数的参数传递

    Python中函数的参数传递 一.在函数的调用时,python解析器不会检查参数的类型,其中实参传递的可以是任意类型的对象(数值型.布尔型.字符串.列表.字典.元组甚至函数). 实例: 结果: 二.在 ...

  7. python中怎么调用函数_浅谈Python中函数的定义及其调用方法

    一.函数的定义及其应用 所谓函数,就是把具有独立功能的代码块组织成为一个小模块,在需要的时候调用函数的使用包含两个步骤 1.定义函数–封装独立的功能 2.调用函数–享受封装的成果 函数的作用:在开发时 ...

  8. python函数定义及调用-浅谈Python中函数的定义及其调用方法

    一.函数的定义及其应用 所谓函数,就是把具有独立功能的代码块组织成为一个小模块,在需要的时候调用函数的使用包含两个步骤 1.定义函数�C封装独立的功能 2.调用函数�C享受封装的成果 函数的作用:在开 ...

  9. Python函数参数传递:传值还是传引用

    引子 首先来看一个列子: def change(val):val.append(100)val = ['T', 'Z', 'Y'] nums = [0, 1] change(nums) print(n ...

最新文章

  1. arrays must all be same length
  2. 史上最烂的项目:苦撑 12 年,600 多万行代码!
  3. 智能哲学:“学习机器”与“机器学习” ——解读图灵思想中的人工智能
  4. Linux之samba服务器的搭建及详解
  5. 去月球“你知道戴维会变身成哪种动物吗?”
  6. 表达、思考和解决问题的逻辑(金字塔原理-高质量读书笔记)
  7. 做了项目才知道的Cookie和Session
  8. ble开发 linux_嵌入式开发的必备知识点
  9. 视觉里程计02 基于特征匹配的位姿估计
  10. php对字符串简单加密解密,PHP字符串加密解密
  11. 英文网站不用愁,必应在线翻译插件解烦忧
  12. 台达PLC,触摸屏程序工程案例 含电气图 台达与伺服变频通讯实例
  13. 华为服务器 修改为传统模式,电脑设置成服务器模式
  14. ubuntu设置截屏热键(区域截屏)
  15. linux硬盘支持fat32,Linux下,挂载windows管理格式的FAT32/NTFS 硬盘
  16. 【安洵杯 2019】easy-web
  17. linux下好玩的文本工具-figlet
  18. CCF A类会议或期刊----多视图聚类近两年论文
  19. 论文笔记Understanding and Diagnosing Visual Tracking Systems
  20. 赋能建筑建材企业物流网络内外联通,B2B交易管理系统打造行业智慧供应链

热门文章

  1. 一张图看懂AI、机器学习、深度学习的关系
  2. 解决:vue 用 axios 发送请求,每次都会发送两次请求
  3. shiro框架的学习
  4. 《算法竞赛进阶指南》0.4二分
  5. 牛客网——最简真分数
  6. [Go] Template 使用简介
  7. Hibernate 多对多关联查询条件使用
  8. linux 文件夹的颜色代表什么意思
  9. EDM的九大用途盘点
  10. JDBC与JNDI应用比较