Python中的引用和拷贝浅析


Posted in Python onNovember 22, 2014

If an object's value can be modified, the object is said to be mutable. If the value cannot be modified,the object is said to be immutable.

mutable 可变类型,例如 list,set,自定义类型(等价于C#中的引用类型);

immutable 不可变类型,例如string,numbers等(等价于C#中的值类型);

一、引用和拷贝(references and copies)

当程序中使用=赋值操作符时,例如a=b,

对于不可变的对象,a作为b的一个拷贝被创建,a和b将指向不同的内存地址,a和b相互独立。

def TestCopy():

    a = 10

    b = a

    a =20

    print (b) #b still is 10

但是对于可变的对象,a作为b的一个引用被创建,a和b的元素公用相同的内存地址,a和b的元素共享。
def TestRef():

    a=[1,2,3,4]

    b=a   #b is a reference to a

    print (b is a) # True

    b[2] = -100 #change an element in b

    print (a) # a also changed to [1,2,-100,4]

二、深拷贝和浅拷贝(shallow copy and deep copy)

为了避免可变对象指向同一个对象,必须创建一个新的拷贝,而不是引用。
在python中可以对容器对象(例如lists和dictionaries)使用两种拷贝:浅拷贝和深拷贝。
 
浅拷贝创建一个新的对象,但是使用原来对象的元素的引用(如果是不变类型,相当于是拷贝)来填充新对象。可以使用copy.copy()来实现浅拷贝。

def TestShallowCopy():

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

    b = list(a) # create a shallow copy of a

    print (b is a) #False

    b.append(100) #append element to b

    print (b)

    print (a) # a is unchanged

    b[2][0] = -100 # modify an element inside b

    print (b)

    print (a)  # a is changed

在这个例子中,a和b共享相同的可变元素。所以修改其中一个list对象中的元素,另一个list对象也会被修改。

深拷贝创建一个新的对象,同时递归地拷贝对象所包含的所有的元素。可以使用copy.deepcopy()来实现深拷贝。

def TestDeepCopy():

  import copy

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

  b = copy.deepcopy(a)

  b[2][0] = -100

  print (b)  # b is changed

  print (a)  # a is unchanged

在这个例子中,a和b是对立的list对象,且他们的元素也相互独立。

三、引用计数和垃圾回收

python中的所有的对象都是引用计数的,一个对象赋值或加入容器时,它的引用计数就会自增,当使用del时或变量赋值为其他值时,引用计数就会自减,当引用计数为0时,python的垃圾回收器就会回收该变量。

def TestGarbageCollection():

  import sys

  print(sys.getrefcount(37))

  a = 37 # Creates an object with value 37

  print(sys.getrefcount(37))

  b = a # Increases reference count on 37

  print(sys.getrefcount(37))

  c = []

  c.append(b) # Increases reference count on 37

  print(sys.getrefcount(37))

  del a # Decrease reference count of 37

  print(sys.getrefcount(37))

  b = 42 # Decrease reference count of 37

  print(sys.getrefcount(37))

  c[0] = 2.0 # Decrease reference count of 37

  print(sys.getrefcount(37)) 

  

TestGarbageCollection()

运行结果为:

11

12

13

14

13

12

11

为啥一上来就有11个引用了呢?谁知道?
Python 相关文章推荐
python基础入门详解(文件输入/输出 内建类型 字典操作使用方法)
Dec 08 Python
Python使用lxml模块和Requests模块抓取HTML页面的教程
May 16 Python
读写json中文ASCII乱码问题的解决方法
Nov 05 Python
Python操作MongoDB数据库的方法示例
Jan 04 Python
python 计算一个字符串中所有数字的和实例
Jun 11 Python
python实现Dijkstra算法的最短路径问题
Jun 21 Python
Django用户认证系统 组与权限解析
Aug 02 Python
python 函数嵌套及多函数共同运行知识点讲解
Mar 03 Python
Jupyter notebook运行Spark+Scala教程
Apr 10 Python
Python Request类源码实现方法及原理解析
Aug 17 Python
django数据模型中null和blank的区别说明
Sep 02 Python
用Python 执行cmd命令
Dec 18 Python
python实现的文件夹清理程序分享
Nov 22 #Python
Python判断操作系统类型代码分享
Nov 22 #Python
python logging类库使用例子
Nov 22 #Python
Python中模拟enum枚举类型的5种方法分享
Nov 22 #Python
Python读写Excel文件方法介绍
Nov 22 #Python
Python中的包和模块实例
Nov 22 #Python
Python动态加载模块的3种方法
Nov 22 #Python
You might like
php代码运行时间查看类代码分享
2011/08/06 PHP
PHP中对各种加密算法、Hash算法的速度测试对比代码
2014/07/08 PHP
PHP实现上传多文件示例代码
2017/02/20 PHP
php变量与字符串的增删改查操作示例
2020/05/07 PHP
基于Jquery的仿照flash放大图片效果代码
2011/03/16 Javascript
jQuery 数据缓存模块进化史详细介绍
2012/11/19 Javascript
Jquery validation remote 验证的缓存问题解决方法
2014/03/25 Javascript
用jquery修复在iframe下的页面锚点失效问题
2014/08/22 Javascript
通过js为元素添加多项样式,浏览器全兼容写法
2014/08/30 Javascript
使用百度地图api实现根据地址查询经纬度
2014/12/11 Javascript
js实现鼠标感应图片展示的方法
2015/02/27 Javascript
使用plupload自定义参数实现多文件上传
2016/07/19 Javascript
如何解决IONIC页面底部被遮住无法向上滚动问题
2016/09/06 Javascript
js与jquery分别实现tab标签页功能的方法
2016/11/18 Javascript
JavaScript实现图片瀑布流和底部刷新
2017/01/02 Javascript
vue ssr 指南详读
2018/06/29 Javascript
JavaScript实现指定数量的并发限制的示例代码
2020/03/10 Javascript
用jQuery实现抽奖程序
2020/04/12 jQuery
Node.js API详解之 V8模块用法实例分析
2020/06/05 Javascript
微信小程序清空输入框信息与实现屏幕往上滚动的示例代码
2020/06/23 Javascript
jQuery实现穿梭框效果
2021/01/19 jQuery
[04:10]2018年度CS GO玩家最喜爱的主播-完美盛典
2018/12/16 DOTA
Python排序函数的使用方法详解
2020/12/11 Python
html5的canvas实现3d雪花飘舞效果
2013/12/27 HTML / CSS
Cotton On美国网站:澳洲时装连锁品牌
2016/10/25 全球购物
小学教师的个人自我鉴定
2013/10/26 职场文书
招商经理岗位职责
2013/11/16 职场文书
给领导的检讨书
2014/02/16 职场文书
2014县委书记党的群众路线教育实践活动对照检查材料思想汇报
2014/09/22 职场文书
公司领导班子群众路线四风问题对照检查材料
2014/10/02 职场文书
房屋过户委托书范本
2014/10/07 职场文书
教育项目合作协议书格式
2014/10/17 职场文书
实习推荐信格式模板
2015/03/27 职场文书
2015年幼师工作总结
2015/04/28 职场文书
争做文明公民倡议书
2019/06/24 职场文书
解决python存数据库速度太慢的问题
2021/04/23 Python