[Python]浅拷贝与深拷贝
来源:互联网 发布:oppo应用分身软件 编辑:程序博客网 时间:2024/06/13 08:53
1、对象赋值
当对象被创建并(将其引用)赋值给变量时,该对象的引用计数就被设置为1。
当同一对象又被赋值给其他变量时,或者作为参数传递给函数、方法或类实例时,或者被赋值为一个窗口对象的成员时,
该对象的一个新的引用(或称为别名)被创建,该对象的计数自动加1。
2、浅拷贝
(1)完全切片操作
(2)利用工厂函数,如list(), dict()等
(3)使用copy模块的copy函数
浅拷贝就是新创建一个类型跟原对象一样,内容是原来对象元素的引用。
浅拷贝时,如果其中的对象是不可变的,则新创建一个元素。如果是可变元素(如list),则只是把它的引用复制,并没有复制成员。
3、深拷贝
创建一个新的容器,包含原有对象元素的全新拷贝
>>> import copy>>>>>> a = [1, 2, 3, ['a', 'b']] # 创建一个list对象,并将其引用赋值给 a>>> b = a # 创建了一个指向同一对象的别名 b,该对象的引用计数增加1>>> sliceCopy = a[:] # 切片操作>>> facCopy = list(a) # 工厂方法操作>>> shallowCopy = copy.copy(a) # 浅拷贝>>> deepCopy = copy.deepcopy(a) # 深拷贝
# 可以看到,a 和 b 的ID完全一样,同一个对象的两个引用,修改其中一个的元素,另外一个也会改变。# 浅拷贝和深拷贝的ID与 a的不一样,修改其中不可改变元素时,其他变量中对应的元素不会改变。# 浅拷贝中 可变元素(list)的ID 与 a 中的一样,所以修改list中的元素时,其他变量中的list元素也会相应改变。# 深拷贝中 可变元素(lsit)的ID 与 a 中的不一样,所以deepCopy 与 a 的修改完全独立,互不干扰。>>> [id(i) for i in (a, b, sliceCopy, facCopy, shallowCopy, deepCopy)][11107304, 11107304, 11107344, 11125144, 11141608, 11107184]>>> [id(i) for i in (a[3], b[3], sliceCopy[3], facCopy[3], shallowCopy[3], deepCopy[3])][11107104, 11107104, 11107104, 11107104, 11107104, 11107064]
>>> a.append(4)>>> a[3].append('c')>>>>>> a[1, 2, 3, ['a', 'b', 'c'], 4]>>> b[1, 2, 3, ['a', 'b', 'c'], 4]>>> sliceCopy[1, 2, 3, ['a', 'b', 'c']]>>> facCopy[1, 2, 3, ['a', 'b', 'c']]>>> shallowCopy[1, 2, 3, ['a', 'b', 'c']]>>> deepCopy[1, 2, 3, ['a', 'b']]>>>>>> sliceCopy[0] = 9>>> sliceCopy[9, 2, 3, ['a', 'b', 'c']]>>> a[1, 2, 3, ['a', 'b', 'c'], 4]>>> b[1, 2, 3, ['a', 'b', 'c'], 4]
0 0
- Python的浅拷贝与深拷贝
- python/c++ 深拷贝与浅拷贝
- Python 深拷贝与浅拷贝
- Python中的浅拷贝与深拷贝
- python 浅拷贝与深拷贝
- Python的深拷贝与浅拷贝
- Python中深拷贝与浅拷贝
- python append()与深拷贝、浅拷贝
- python浅拷贝与深拷贝
- Python 的深拷贝与浅拷贝
- python中的深拷贝与浅拷贝
- Python:深拷贝与浅拷贝
- python 赋值、浅拷贝与深拷贝
- [Python]浅拷贝与深拷贝
- Python浅拷贝与深拷贝
- Python中的浅拷贝与深拷贝
- Python的深拷贝与浅拷贝
- python-深拷贝与浅拷贝
- 1023: 最大数问题
- 1.12 关系的完整性
- Vi编辑器的常用命令
- GetLastError函数
- [AC自动机 + DP] BZOJ1030: [JSOI2007]文本生成器
- [Python]浅拷贝与深拷贝
- 剑指offer--二叉搜索树的后序遍历序列
- 【mark】QQ 探测,爬取网页内容
- [数学期望]BZOJ 1415
- adc驱动实例(工作队列+等待队列+设备树+属性文件)
- Java入门学习-学会try/catch/throw的用法。做出一个计算器除法功能,除以0时程序必须给出提示。
- 字符串匹配
- 大数据时代的小数字感:数据再有价值,别人听不懂照样没用
- Unity3DGame学习笔记(6):粒子系统