文档章节

零基础学python-17.2 参数与共享引用

raylee2015
 raylee2015
发布于 2015/09/17 16:41
字数 719
阅读 2
收藏 0

这一章节我们来讨论一下参数与共享引用

承接上一章节所说的参数的传递是通过自动将对象赋值给本地变量名来实现的,其本质就是复制引用,传递对象

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-目录

 


版权声明:本文为博主原创文章,未经博主允许不得转载。

本文转载自:http://blog.csdn.net/raylee2007/article/details/48488733

raylee2015
粉丝 6
博文 265
码字总数 44224
作品 0
江门
私信 提问
Python猫荐书系列之七:Python入门书籍有哪些?

本文原创并首发于公众号【Python猫】,未经授权,请勿转载。 原文地址:https://mp.weixin.qq.com/s/ArN-6mLPzPT8Zoq0Na_tsg 最近,猫哥的 Python 技术学习群里进来了几位比较特殊的同学:一...

豌豆花下猫
05/26
33
0
Python36讲零基础速成班

主办方: 有用教育(上海荣隆教育科技有限公司)是一家专业培养资深IT工程师并让学员高薪就业、专注于Python开发、AI人工智能的教育机构,公司总部设立在上海,为IT人员提供到岗即用式的实战培...

有用教育
05/08
4
0
Python基础总结成千行代码,让Python入门更简单!

只要学会这千行代码,不管你是零基础还是弱基础或是没有接触过编程,都可以快速入门Python!当时我就不信邪啊,等我看完之后,即使作为一个Python老鸟了,还是领会到了很多教授他的独特见解!...

糖宝lsh
2018/09/10
232
0
python是如何进行内存管理的

Python引入了一个机制:引用计数。 python内部使用引用计数,来保持追踪内存中的对象,Python内部记录了对象有多少个引用,即引用计数,当对象被创建时就创建了一个引用计数,当对象不再需要...

糖宝lsh
2018/12/14
47
0
家里断网好无聊,正好最近学了Python来破解下邻居的WiFi试试!

家里WiFi没网了,贼无聊,正好隔壁几家的邻居都出去玩了,偷偷的破解他们的WiFi用用应该不要紧的~ Python是我刚学的,破解WiFi也是临时想法,不过Python的学习资料一大把是真的!一个刚从培训...

Python小哥哥
2018/09/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常

统一返回值 在前后端分离大行其道的今天,有一个统一的返回值格式不仅能使我们的接口看起来更漂亮,而且还可以使前端可以统一处理很多东西,避免很多问题的产生。 比较通用的返回值格式如下:...

晓月寒丶
昨天
59
0
区块链应用到供应链上的好处和实际案例

区块链可以解决供应链中的很多问题,例如记录以及追踪产品。那么使用区块链应用到各产品供应链上到底有什么好处?猎头悬赏平台解优人才网小编给大家做个简单的分享: 使用区块链的最突出的优...

猎头悬赏平台
昨天
28
0
全世界到底有多少软件开发人员?

埃文斯数据公司(Evans Data Corporation) 2019 最新的统计数据(原文)显示,2018 年全球共有 2300 万软件开发人员,预计到 2019 年底这个数字将达到 2640万,到 2023 年达到 2770万。 而来自...

红薯
昨天
65
0
Go 语言基础—— 通道(channel)

通过通信来共享内存(Java是通过共享内存来通信的) 定义 func service() string {time.Sleep(time.Millisecond * 50)return "Done"}func AsyncService() chan string {retCh := mak......

刘一草
昨天
58
0
Apache Flink 零基础入门(一):基础概念解析

Apache Flink 的定义、架构及原理 Apache Flink 是一个分布式大数据处理引擎,可对有限数据流和无限数据流进行有状态或无状态的计算,能够部署在各种集群环境,对各种规模大小的数据进行快速...

Vincent-Duan
昨天
60
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部