python引用在函数传参时的体现以及可变与不可变对象的对比
2015-05-07 18:40
696 查看
今天偶然看到 vamei 老师的博客 http://www.cnblogs.com/vamei/archive/2012/07/10/2582795.html 讲的是python动态类型以及引用的事儿。才发现python的一个基础也是核心知识没有注意到。
执行结果:
执行结果:
可以看出,当参数是可变参数时,函数内部改变这个参数,函数外部会受到影响!
最后:虽然此时发现x内部的元素变了,但其实如果使用id查看该变量的内存位置,其实依旧没有变化。
这也即是可变与不可变对象的最大区别。
不可变对象:变量本身不可变,如果对其做修改,只会默认给你返回一个全新的变量,内存地址和值都是新的。
可变对象 :变量本身可变,如果对其做修改,会在其自身状态上直接做变化,也就是内存地址不变,而值变化了。
当给函数传递的参数是不可变类型时,形参和实参本身的改变是互不影响的。
当给函数传递的参数是可变类型时,形参和实参本省的改变是相互影响的。
#函数参数是不可变类型 def f(x): x += 1 print x x=1 print x f(x) print x
执行结果:
#函数参数是可变类型 def f(x): x[0] += 1 print x x=[1,2,3] print x f(x) print x
执行结果:
可以看出,当参数是可变参数时,函数内部改变这个参数,函数外部会受到影响!
最后:虽然此时发现x内部的元素变了,但其实如果使用id查看该变量的内存位置,其实依旧没有变化。
这也即是可变与不可变对象的最大区别。
不可变对象:变量本身不可变,如果对其做修改,只会默认给你返回一个全新的变量,内存地址和值都是新的。
可变对象 :变量本身可变,如果对其做修改,会在其自身状态上直接做变化,也就是内存地址不变,而值变化了。
相关文章推荐
- python函数参数是值传递还是引用传递(以及变量间复制后是否保持一致):取决于对象内容可变不可变
- python函数参数是值传递还是引用传递(以及变量间复制后是否保持一致):取决于对象内容可变不可变
- python函数参数是值传递还是引用传递:取决于对象内容可变不可变
- Python中的可变,不可变对象;值类型,引用类型;浅拷贝,深拷贝理解
- python函数是引用传递(对可变对象而言)
- python学习之路——函数关于可变对象和不可变对象问题
- python知识整理--议可变对象和不可变对象以及str、list、tuple、dict、set
- python 传值 传引用 可变对象 不可变对象 的区别与联系
- Python可变对象v.s.不可变对象,引用
- python:setattr的迷惑以及函数作为对象添加引用
- python可变对象以及不可变对象以及+=和=+的区别
- python 对象拷贝——浅拷贝和深拷贝 之函数传递——值传递还是引用传递?
- python参数传递问题与可变/不可变对象
- Python基础(3)_可变对象与不可变对象、列表、元祖和字典
- python中的可变对象和不可变对象
- python作用域的补充,局部引用全局作用域的修改尝试,可变类型内部可修改,内存指向不可变
- 【Python学习日记】dic和set 以及什么是 不可变对象
- Objective-C:MRC(引用计数器)在OC内部的可变对象是适用的,不可变对象是不适用的(例如 NSString、NSArray等)
- python起步——可变对象和不可变对象
- python的raw_input()函数。 函数的可变对象和不可变对象作为参数传递。