1. 传值与传址的区别

传值就是传入一个参数的值,传址就是传入一个参数的地址,也就是内存的地址(相当于指针)。他们的区别是如果函数里面对传入的参数重新赋值,函数外的全局变量是否相应改变:用传值传入的参数是不会改变的,用传址传入就会。

defa(n):

n[2] = 100

print(n)returnNonedefb(n):

n+= 100

print(n)returnNone

an= [1,2,3,4,5]

bn= 10

print(an)

a(an)print(an)print(bn)

b(bn)print(bn)

[1, 2, 3, 4, 5]

[1, 2, 100, 4, 5]

[1, 2, 100, 4, 5]10

110

10

在上面的例子中,an是一个list,将其作为实参传入函数a中,a对其第三个元素进行修改。a执行结束后再次打印an,发现里面的元素的确发生变化,这就是传址操作。bn代表一个数字,将其传入函数b,并做修改,b执行结束后再次打印bn,没有变化,这是传值操作。

2. Python中传值与传址的规律

Python是不允许程序员选择采用传值还是传址的。Python参数传递采用的是“传对象引用”的方式,实际上,这种方式相当于传值和传址的一种综合。

如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值——相当于传址。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象——相当于传值。所以python的传值和传址是根据传入参数的类型来选择的。

传值的参数类型:数字,字符串,元组

传址的参数类型:列表,字典

3. 内置函数id

内置函数id,负责显示一个变量或者数据在内存中的地址,有时可以用来检测所使用的对象是否为同一个,帮助区别传值与传址操作。

但是id在有些情况下比较特殊,注意下面的例子。

a = 100b= 200

print(id(a))print(id(b))

c=aprint(id(c))print(a isc)

a+= 300

print(a)print(c)print(a isc)print(id(a))print(id(c))

1549495552

1549498752

1549495552True400

100False93638128

1549495552

为了提高内存利用效率,对于一些简单的对象,如一些数值较小的int对象,python采取重用对象内存的办法。如指向a=100,c=100时,由于100作为简单的int类型且数值小,python不会两次为其分配内存,而是只分配一次,然后将a与c同时指向已分配的对象。但是当a的值发生变化时,会单独为a重新分配一个新的内存。

4. list传值与传址

list类型使用简单的赋值操作,是传址。

a = [1,2,3,4,5]

b=aprint(a)

b[2] = 333

print(a)print(b)print(id(a))print(id(b))

[1, 2, 3, 4, 5]

[1, 2, 333, 4, 5]

[1, 2, 333, 4, 5]96142472

96142472

copy函数是浅拷贝,是传值。python2中,需要import copy模块,python3可直接使用。

a = [1,2,3,4,5]

b=a.copy()print(a)

b[2] = 333

print(a)print(b)print(id(a))print(id(b))

[1, 2, 3, 4, 5]

[1, 2, 3, 4, 5]

[1, 2, 333, 4, 5]92990536

96202632

由于copy是浅拷贝,只拷贝一层的内容,当遇到下列情况时,copy不能实现完全的传值操作。

a = [1,2,3,[10,20,30]]

b=a.copy()print(id(a))print(id(b))print(id(a[3]))print(id(b[3]))

a[3][2] = 666

print(a)print(b)

96141704

93355400

96141768

96141768[1, 2, 3, [10, 20, 666]]

[1, 2, 3, [10, 20, 666]]

要解决这个问题,需要使用deepcopy。python3中,直接可以使用copy()方法,但deepcopy()还是需要导入copy模块。

importcopy

a= [1,2,3,[10,20,30]]

b=copy.deepcopy(a)print(id(a))print(id(b))print(id(a[3]))print(id(b[3]))

a[3][2] = 666

print(a)print(b)

96503944

93002376

96886024

93352712[1, 2, 3, [10, 20, 666]]

[1, 2, 3, [10, 20, 30]]

5. tuple操作

tuple元组是不可修改的,指的是其元组内容不可改。

t1 = (1,2,3)

t1[1] = 100

---------------------------------------------------------------------------TypeError Traceback (most recent call last) in ()1 t1 = (1,2,3)----> 2 t1[1] = 100TypeError:'tuple' object does not support item assignment

但是其所指向的内存地址是可变的。

t1 = (1,2,3)

t2= (5,6,7)print(id(t1))

t1+=t2print(t1)print(id(t1))print(id(t2))

t2*= 3

print(t2)print(id(t2))

96151520(1, 2, 3, 5, 6, 7)93048552

94080672(5, 6, 7, 5, 6, 7, 5, 6, 7)93656912

并不是起初的t1和t2所指向的元组内容发生了变化,而是新分配了两个元组内存,t1和t2所指向的内存发生改变。

python函数传值还是地址_Python传值与传址相关推荐

  1. python函数传值还是地址_python中给函数传参是传值还是传引用

    首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传 ...

  2. python函数定义与参数_Python函数的定义方式与函数参数问题实例分析

    本文实例讲述了Python函数的定义方式与函数参数问题.分享给大家供大家参考,具体如下: 涉及内容: 函数的定义方式 函数的文字描述 空操作语句 位置参数 默认参数 关键参数 可变长度参数 函数的定义 ...

  3. python函数参数定义顺序_Python函数定义-位置参数-返回值

    原标题:Python函数定义-位置参数-返回值 1 函数介绍 函数在编程语言中就是完成特定功能的一个词句组(代码块),这组语句可以作为一个单位使用,并且给它取一个名字.可以通过函数名在程序的不同地方多 ...

  4. python函数type的用意_Python内置函数Type()函数一个有趣的用法

    Python内置函数Type()函数一个有趣的用法 今天在网上看到type的一段代码 ,然后查了一下文档,才知道type还有三个参数的用法. 以前只是知道type可以检测对象类型.然后发现了一个有趣的 ...

  5. python 函数修饰器 父类_Python函数嵌套、回调函数、闭包、装饰器和类

    markdown内容:Python函数嵌套.回调函数.闭包.装饰器和类 一级标题:主要描述内容 二级标题:各个内容 三级标题:重要概念 一.函数嵌套 1.1.作用域和嵌套函数 LEGB查找规则的 E, ...

  6. python正则匹配ip地址_Python正则表达式匹配ip地址实例

    Python正则表达式匹配ip地址实例 更新时间:2014年10月09日 11:22:51 投稿:shichen2014 这篇文章主要介绍了Python正则表达式匹配ip地址实例,通过简单的实例讲述了 ...

  7. python函数的组成要素_python函数要素有哪些?这7点是你写好python代码的关键

    [摘要]对于python小白来说,写好一个python代码并不容易,不过你知道python函数要素有哪些?这7点是你写好python代码的关键,如果你想学好python,那么本文内容一定要自己试试,毕 ...

  8. python函数的嵌套调用_python函数的嵌套调用

    我们之前的代码都是定义函数然后直接调用,但是没有在一个函数内调用另外一个函数,今天就感受下函数嵌套调用. 提示:如果你想当然的认为函数嵌套是在函数内部又嵌套定义一个函数这种操作的话,那么这叫做闭包.相 ...

  9. python函数的使用方法_Python函数使用

    Python函数用def指定函数名,可以指定输入参数,可以指定参数的默认值,也可以用return指定返回值. 调用时除了默认的位置赋值,也可按关键字赋值. 一.函数不带参数.没有返回值 defhell ...

最新文章

  1. 解决Visual Studio禁止使用strlen函数的问题
  2. 什么是接口幂等性?为什么会产生这个问题?如何保证接口幂等性?
  3. 最先进的计算机视觉|AI和工业4.0之间,还有多远的差距?
  4. Smarty中的内建函数(一)config_load、foreach
  5. .NET Core微服务 权限系统+工作流(一)权限系统
  6. 手机型号识别 手机PID UID 驱动识别 数据库包
  7. php ‘\n‘ 与 “\n“的区别
  8. 数学建模姜启源5.1人口增长——学习记录
  9. 学会提问-批判性思维指南运用
  10. U盘提示磁盘写保护无法强制格式化------使用量产工具解决
  11. el-table 样式自定义
  12. vscode在Windows下配置C语言环境,设置三个配置文件
  13. 跨境电商| FaceBook 群发消息
  14. scrollView 横向
  15. win10 解决:无法访问网络地址
  16. FW:平凡(trivial)和非平凡(non-trivial)_拔剑-浆糊的传说_新浪博客
  17. 2022大学生就业指导答案——雷五明、雷辉等
  18. matlab绘制四棱台,几何画板绘制正四棱台的详细步骤
  19. 计算机音乐only my,【B型】only my railgun (自己调整)
  20. SQL 连接 JOIN 例解

热门文章

  1. Flink on Zeppelin 流计算处理最佳实践
  2. MaxCompute技术人背后的故事:从ApacheORC到AliORC
  3. 阿里开发者招聘节 | 面试题06-07: MySQL的数据如何恢复到任意时间点
  4. 使用Terraform创建托管版Kubernetes
  5. CSDN 十大技术主题盘点-云原生篇
  6. 投稿指南 | 云计算领域最前沿资讯、技术,期待您的专业解读!
  7. 超详细 | 21张图带你领略集合的线程不安全
  8. 今天,我要教妹子学会Spring:Aware、异步编程、计划任务
  9. 推出超低功耗数字式热释电传感器,翠展微电子厉害了……
  10. VMware vSphere 6.7主机与虚拟机高级管理