python 浅拷贝(shallow copy) 深拷贝(deep copy)
来源:互联网 发布:北京折叠 知乎 编辑:程序博客网 时间:2024/05/01 23:45
浅拷贝(shallow copy)
copy(x) 创建新的复合对象并通过引用复制x的成员来创建x的浅复制。
更加深层次说,它复制了对象,但对于对象中的元素,依然使用引用。
既然浅拷贝用的是引用,为何我修改了一些值,却不会影响到它的拷贝副本呢?
那就是因为修改的是不可变对象,不可变对象发生变化时会生成新的引用指向新的值,也就不会对原有对象产生影响。
所以浅copy需要注意:
1.在副本字典中修改这些不可变对象(如字符串,数字,元组[只包含不可变对象的元组])是不会影响原始字典
2.在副本字典中修改可变对象,那么原始字典的内容会被影响
原因:不可变对象发生变化时会生成新的引用指向新的值,而可变对象的值发生变化时,不会生成新的引用
例子1
a = {'Wangdachui': 3000}b = a.copy()
a['Niuyun'] = 2000print aprint bprint a is b
output:
{'Wangdachui': 3000, 'Niuyun': 2000}{'Wangdachui': 3000}False
例子2
a = {'Wangdachui': 3000}b = a
a['Niuyun'] = 2000print aprint bprint a is b
output:
{'Wangdachui': 3000, 'Niuyun': 2000}{'Wangdachui': 3000, 'Niuyun': 2000}True
例子3
info = [('Wangdachui', 3000), (123, 2000), ('Linling', 4500), ('Tianqi', ['foo', 'bar', 'baz'])]
#我们可以看到的info浅复制对象dict1,它们是不同的对象,所以对对象的改变是不会#影响彼此的,但是这些info和dict1对象的元素是引用的同一个,所以info或者dict1更改了它的对象的元素就会影响到另外一个的值。dict1 = dict(info)print 'dict1 %s' % dict1#同样的dict2又是dict1的浅复制对象dict2 = dict1.copy()print 'dict2 %s' % dict2
output1:
dict1 {'Tianqi': ['foo', 'bar', 'baz'], 123: 2000, 'Wangdachui': 3000, 'Linling': 4500}dict2 {'Tianqi': ['foo', 'bar', 'baz'], 123: 2000, 'Wangdachui': 3000, 'Linling': 4500}
#修改不可变对象dict2['Wangdachui'] = 55555#修改可变对象dict2['Tianqi'].remove('bar')print 'dict1 %s' % (dict1)print 'dict2 %s' % dict2print 'info %s' % info
output2:
dict1 {'Tianqi': ['foo', 'baz'], 123: 2000, 'Wangdachui': 3000, 'Linling': 4500}dict2 {'Tianqi': ['foo', 'baz'], 123: 2000, 'Wangdachui': 55555, 'Linling': 4500}info [('Wangdachui', 3000), (123, 2000), ('Linling', 4500), ('Tianqi', ['foo', 'baz'])]
#修改不可变对象dict1['Linling'] = 55555#修改可变对象dict1['Tianqi'].append('add')print 'dict1 %s' % (dict1)print 'dict2 %s' % dict2print 'info %s' % info
output3:
dict1 {'Tianqi': ['foo', 'baz', 'add'], 123: 2000, 'Wangdachui': 3000, 'Linling': 55555}dict2 {'Tianqi': ['foo', 'baz', 'add'], 123: 2000, 'Wangdachui': 55555, 'Linling': 4500}info [('Wangdachui', 3000), (123, 2000), ('Linling', 4500), ('Tianqi', ['foo', 'baz', 'add'])]
1 0
- python 浅拷贝(shallow copy) 深拷贝(deep copy)
- shallow copy and deep copy (浅拷贝 vs 深拷贝)
- 浅拷贝和深拷贝(shallow copy VS deep copy )
- 深拷贝与浅拷贝(Deep Copy and Shallow Copy)
- 深拷贝与浅拷贝(Deep Copy and Shallow Copy)
- iOS 浅拷贝(Shallow Copy)与深拷贝(Deep Copy)
- 深拷贝(deep clone)和浅拷贝(shallow copy)
- Shallow Copy(影子拷贝) VS Deep Copy(深拷贝)
- .NET深入学习笔记(4):深拷贝与浅拷贝(Deep Copy and Shallow Copy)
- NET深入学习笔记(4):深拷贝与浅拷贝(Deep Copy and Shallow Copy)
- .NET深入学习笔记(4):深拷贝与浅拷贝(Deep Copy and Shallow Copy)(转载)
- .NET深入学习笔记(4):深拷贝与浅拷贝(Deep Copy and Shallow Copy)
- NET深入学习笔记(4):深拷贝与浅拷贝(Deep Copy and Shallow Copy)
- Deep copy(深拷贝)和shallow copy(浅拷贝)的区别
- IOS开发之深拷贝与浅拷贝(mutableCopy与Copy)详解(shallow copy and deep copy)
- 深浅拷贝:即Deep Copy和Shallow Copy的区别
- IOS 深拷贝和浅拷贝问题 (deep copy and shadow copy)
- iOS 内存管理~浅拷贝(Shallow Copy)
- tableview下拉头部视图背景变大
- 3.5.3元组的基本操作
- 定时器的实现
- 开漏输出
- 安装php-redis扩展
- python 浅拷贝(shallow copy) 深拷贝(deep copy)
- PMI-ACP敏捷项目管理辅导:敏捷开发之 4句敏捷宣言
- android apk静默安装和卸载
- crontab输出内容发送到指定邮箱
- 获取字体的长度
- 比较好看的菜单选项
- Java学习笔记之Java语言基础组成
- 实时判断EditText里面输入的字数
- AFN错误总结