零基础学python-17.2 参数与共享引用
2015-09-16 08:59
274 查看
这一章节我们来讨论一下参数与共享引用
承接上一章节所说的参数的传递是通过自动将对象赋值给本地变量名来实现的,其本质就是复制引用,传递对象
1.我们下面以传递不可变对象为例子:
从代码可以看出,传递过程中x赋值了1这个对象的引用,只是把1赋值给b的引用复制一份给x,所以b与x的id都是相同的,引用相同内存地址
而当x修改变成2,只不过是重新创建一个对象,然后把引用赋值给x,所以x的id变了,也就是引用的对象变了
2.我们再来看看以可变对象为例子:
我们沿用上面的代码,然后在里面加上可修改对象,由结果可以看见,不可修改对象满足第一点的结论,但是,可修改对象就不一样,在整个运算过程中,a和y所引用的对象其实是没有改变,只是修改了对象里面的其中一个值,我们下面给出一个图片来说明
因为参数是通过赋值传递的,函数中的参数名可以调用时通过变了实现共享对象。因此,函数中对可变对象参数的在原处的修改能够影响调用者。
3.避免可变对象的修改
我们只需要通过列表的复制,就可以避免列表在运算过后改变
或者我们在函数里面就已经进行复制,不需要再函数外操作
总结:这一章节简单介绍了参数与共享引用,以及参数是可变对象时出现的问题和解决方案。
这一章节就说到这里,谢谢大家
------------------------------------------------------------------
点击跳转零基础学python-目录
承接上一章节所说的参数的传递是通过自动将对象赋值给本地变量名来实现的,其本质就是复制引用,传递对象
1.我们下面以传递不可变对象为例子:
>>> b=1 >>> def test(x): print(x) print(id(x)) x=2 print(x) print(id(x)) >>> test(b) 1 497734096 2 497734112 >>>
从代码可以看出,传递过程中x赋值了1这个对象的引用,只是把1赋值给b的引用复制一份给x,所以b与x的id都是相同的,引用相同内存地址
而当x修改变成2,只不过是重新创建一个对象,然后把引用赋值给x,所以x的id变了,也就是引用的对象变了
2.我们再来看看以可变对象为例子:
>>> b=1 >>> a=[1,2,3] >>> def test(x,y): print(x) print(id(x)) x=2 print(x) print(id(x)) print(y) print(id(y)) y[1]=6 print(y) print(id(y)) >>> test(b,a) 1 497734096 2 497734112 [1, 2, 3] 37586224 [1, 6, 3] 37586224 >>>
我们沿用上面的代码,然后在里面加上可修改对象,由结果可以看见,不可修改对象满足第一点的结论,但是,可修改对象就不一样,在整个运算过程中,a和y所引用的对象其实是没有改变,只是修改了对象里面的其中一个值,我们下面给出一个图片来说明
因为参数是通过赋值传递的,函数中的参数名可以调用时通过变了实现共享对象。因此,函数中对可变对象参数的在原处的修改能够影响调用者。
3.避免可变对象的修改
>>> b=1 >>> a=[1,2,3] >>> def test(x,y): print(x) print(id(x)) x=2 print(x) print(id(x)) print(y) print(id(y)) y[1]=6 print(y) print(id(y)) >>> test(b,a[:])#改动的地方 1 497734096 2 497734112 [1, 2, 3] 37588624 [1, 6, 3] 37588624 >>> a [1, 2, 3]
我们只需要通过列表的复制,就可以避免列表在运算过后改变
或者我们在函数里面就已经进行复制,不需要再函数外操作
>>> b=1 >>> a=[1,2,3] >>> def test(x,y): print(x) print(id(x)) x=2 print(x) print(id(x)) t=y[:]#改变的地方 print(t) print(id(t)) t[1]=6 print(t) print(id(t)) print(y) >>> test(b,a) 1 497734096 2 497734112 [1, 2, 3] 37108592 [1, 6, 3] 37108592 [1, 2, 3] >>> a [1, 2, 3] >>>
总结:这一章节简单介绍了参数与共享引用,以及参数是可变对象时出现的问题和解决方案。
这一章节就说到这里,谢谢大家
------------------------------------------------------------------
点击跳转零基础学python-目录
相关文章推荐
- Python日积月累之 islower()
- Python日积月累之isdigit()
- 关于Python Package下的Module import方式[转]
- python随笔(三)
- Python中的内存管理【转载】
- Python学习笔记3--字符串
- Python中的Berkeley DB(1):Hello Berkeley DB
- 关于逻辑回归(Logistic regression)模型的简单思考
- 【Python】切割字符串
- 【Python】正则表达式的威力
- Python学习,可爱的Python第一篇
- 零基础学python-17.1 参数的传递快速入门
- 零基础学python-17.1 参数的传递快速入门
- 【Python之旅】第二篇(五):基于列表、字典和元组的员工信息处理接口
- Python学习笔记2--模式匹配
- Mac OS 中的 Python(和 NumPy)开发环境设置
- 利用python opencv实现图像自适应二值化
- python属性
- Python-docx简介
- 2015/9/15 Python基础(12):模块和包