您的位置:首页 > 编程语言 > Python开发

python参数传递问题与可变/不可变对象

2017-02-25 23:05 555 查看
最近在写python程序的时候老是担心参数的传递问题。需要完全创建一个相同的新对象时都会不放心的加上一句deepcopy,于是乎借此机会将python的参数传递机制深入了解。

网上有段话描述的很清楚,转载如下:

1.Python不允许程序员选择采用传值还是传引用。Python参数传递采用的肯定是“传对象引用”的方式。实际上,这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值——相当于通过“传引用”来传递对象。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象——相当于通过“传值”来传递对象。

2.当人们复制列表或字典时,就复制了对象列表的引用同,如果改变引用的值,则修改了原始的参数。

3.为了简化内存管理,Python通过引用计数 机制实现自动垃圾回收功能,Python中的每个对象都有一个引用计数,用来计数该对象在不同场所分别被引用了多少次。每当引用一次Python对象,相应的引用计数就增1,每当消毁一次Python对象,则相应的引用就减1,只有当引用计数为零时,才真正从内存中删除Python对象。

可变对象和不可变对象分别有以下几种:

不可变(immutable):int、字符串(string)、float、(数值型number)、元组(tuple)

可变(mutable):字典型(dictionary)、列表型(list)

python 中有以下几种常用引用变量(对象)的形式,为简化内容这里仅讨论可变对象:

直接引用:不会分配新的内存区域,即仅仅是简单的引用。

浅复制(copy.copy):为对象分配新的内存区域, 但不拷贝对象的内部属性。Eg:对象内部数组采用引用形式,不再分配新内存。

深复制(copy.deepcopy):为对象分配新内存区域,拷贝对象内部属性。Eg:对象内部数组也拷贝一份。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 对象