python知识点(三):复制(引用、拷贝、浅拷贝和深拷贝)
来源:互联网 发布:淘宝的代购可信吗 编辑:程序博客网 时间:2024/05/01 14:20
在平时项目中,我们经常需要对变量或者数组进行复制操作,python内部对于复制操作有着自己一套规定,很多情况下容易发生错误使用的情况。以下对复制操作的一个总结。
1) 引用和拷贝(references and copies)
当程序中使用赋值操作符=时,对于不可变对象(If the value cannot be modified, the object is said to be immutable, like string,numbers),a作为b的一个拷贝被创建,a和b将指向不同的内存地址,a和b相互独立;但是对于可变的对象(If an object’s value can be modified, the object is said to be mutable,like list, set, dictionary),a作为b的一个引用被创建,a和b的元素公用相同的内存地址,a和b的元素共享。如:
#coding: utf-8 a = 10b = aa =20a=[1,2,3,4]b=a #b是a的一个引用print (b is a) # Trueb[2] = -100 print (a) # [1,2,-100,4]
二、深拷贝和浅拷贝(shallow copy and deep copy)
为了避免可变对象指向同一个对象,必须创建一个新的拷贝,而不是引用。在python中可以对容器对象(An object that contains references to other objects is said to be a container or collection)使用两种拷贝:浅拷贝和深拷贝。浅拷贝使用copy模块中copy()函数创建一个新的对象,但是使用原来对象的元素的引用(如果是不变类型,相当于是拷贝)来填充新对象。深拷贝使用deepcopy()函数来创建一个新的对象,同时递归地拷贝对象所包含的所有的元素。换句话说 copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。copy.deepcopy 深拷贝 拷贝对象及其子对象。举例如下:
#coding: utf-8 import copya = [1, 2, 3, 4, ['a', 'b']] #原始对象b = a #赋值,传对象的引用c = copy.copy(a) #对象拷贝,浅拷贝d = copy.deepcopy(a) #对象拷贝,深拷贝a.append(5) #修改对象aa[4].append('c') #修改对象a中的['a', 'b']数组对象print a # [1, 2, 3, 4, ['a', 'b', 'c'], 5]print b # [1, 2, 3, 4, ['a', 'b', 'c'], 5]print c # [1, 2, 3, 4, ['a', 'b', 'c']]print d # [1, 2, 3, 4, ['a', 'b']]
- python知识点(三):复制(引用、拷贝、浅拷贝和深拷贝)
- python知识点:浅拷贝和深拷贝
- python中的复制 浅拷贝 深拷贝
- python复制,浅拷贝,深拷贝理解
- python的引用和浅拷贝和p深拷贝
- python的复制,深拷贝和浅拷贝
- python 引用 浅拷贝 深拷贝
- 复制对象 和 浅拷贝,深拷贝
- python 引用,浅copy和深拷贝
- python 引用和拷贝
- python 引用和拷贝
- 引用浅拷贝深拷贝
- Python浅拷贝和和深拷贝
- python 的深拷贝和浅拷贝
- Python深拷贝和浅拷贝
- Python的浅拷贝和深拷贝
- python 浅拷贝和深拷贝
- python中的深拷贝和浅拷贝
- Apache Spark MLlib学习笔记(三)MLlib统计指标之关联/抽样/汇总
- shellcode - Python vs Perl
- iOS 不通过textfield代理(与html5交互) 收起键盘
- Chapter 2 – Defining the verification environment
- Android之Matrix的用法
- python知识点(三):复制(引用、拷贝、浅拷贝和深拷贝)
- Lua学习(八)-----协同程序
- 日语五十音图记忆口诀
- 有趣的数字
- 关于声明文件中android:process属性说明
- 字节序
- halcon中的整型与浮点型的转换(待补充)
- 锚点
- 常用C时间函数