Python 中的浅拷贝和深拷贝
1. 列表和字典,直接赋值,都是浅拷贝,即赋值双方指向同一地址,因为 Python 对可变对象按引用传递。
>>> a = [1, 2, 3]
>>> b = a
>>> b
[1, 2, 3]
>>> a[0] = 'apple'
>>> a
['apple', 2, 3]
>>> b
['apple', 2, 3]
>>>
>>>
>>> dic = {'a': 'apple', 'b': 'banbana'}
>>> dic2 = dic
>>> dic2
{'a': 'apple', 'b': 'banbana'}
>>> dic['b'] = 'blueberry'
>>> dic
{'a': 'apple', 'b': 'blueberry'}
>>> dic2
{'a': 'apple', 'b': 'blueberry'}
2. 对非嵌套的列表,使用完全切片[:], 工厂函数 list(),或者 copy.copy() 都是深拷贝。
>>> a = [1, 2, 3]
>>> b = list(a)
>>> c = a[:]
>>> import copy
>>> d = copy.copy(a)
>>>
>>> a[0] = 'apple'
>>> a
['apple', 2, 3]
>>> b
[1, 2, 3]
>>> c
[1, 2, 3]
>>> d
[1, 2, 3]
3. 对于非嵌套的字典,使用工厂函数 dict(),或者 copy.copy() 都是深拷贝。
>>> dic = {'a': 'apple', 'b': 'banana'}
>>> dic2 = dict(dic)
>>> import copy
>>> dic3 = copy.copy(dic)
>>>
>>> dic['b'] = 'blueberry'
>>> dic
{'a': 'apple', 'b': 'blueberry'}
>>> dic2
{'a': 'apple', 'b': 'banana'}
>>> dic3
{'a': 'apple', 'b': 'banana'}
4. 对于嵌套的列表,嵌套的字典,只能使用 copy.deepcopy() 实现深拷贝。
>>> import copy
>>>
>>> a = [1, 2, ['apple']]
>>> b = copy.deepcopy(a)
>>> a[2][0] = 'watermelon'
>>> a
[1, 2, ['watermelon']]
>>> b
[1, 2, ['apple']]
>>>
>>>
>>> dic = {'a': 'apple', 'b': {'b1': 'banana', 'b2': 'blueberry'}}
>>> dic2 = copy.deepcopy(dic)
>>> dic['b']['b1'] = 'bukeneng'
>>> dic
{'a': 'apple', 'b': {'b1': 'bukeneng', 'b2': 'blueberry'}}
>>> dic2
{'a': 'apple', 'b': {'b1': 'banana', 'b2': 'blueberry'}}
5. 对于嵌套可变对象的元组,只有 copy.deepcopy() 实现深拷贝。
>>> import copy
>>>
>>> t = (1, 2, ['apple'])
>>> t2 = t
>>> t3 = tuple(t)
>>> t4 = copy.copy(t)
>>> t5 = copy.deepcopy(t)
>>>
>>> t[2][0] = 'watermelon'
>>> t
(1, 2, ['watermelon'])
>>> t2
(1, 2, ['watermelon'])
>>> t3
(1, 2, ['watermelon'])
>>> t4
(1, 2, ['watermelon'])
>>> t5
(1, 2, ['apple'])
完。
Python 中的浅拷贝和深拷贝的更多相关文章
- python中的浅拷贝,深拷贝
直接引用,间接引用 # 1.列表存储的是索引对应值的内存地址,值会单独的开辟一个内存空间 list = ["a","b"] 内存里面存储的就是list[0],l ...
- python中的浅拷贝和深拷贝
1.赋值语句 a = 'abc' b = a print id(a) print id(b) # id(a):29283464 # id(b):29283464 通过简单的复制,我们可以看到,a b其 ...
- 16.python中的浅拷贝和深拷贝
在讲什么是深浅拷贝之前,我们先来看这样一个现象: a = ['scolia', 123, [], ] b = a[:] b[2].append(666) print a print b
- Python中的浅拷贝与深拷贝
编者注:本文主要参考了<Python核心编程(第二版)> 以下都是参考资料后,我自己的理解,如有错误希望大家不吝赐教. 大家有没有遇到这样一种情况,对象赋值后,对其中一个变量进行修改,另外 ...
- (转+原)python中的浅拷贝和深拷贝
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6069722.html 原网址: http://blog.csdn.net/sunshine_in_mo ...
- Python中的赋值、深拷贝与浅拷贝(内存地址)
Python中的赋值.深拷贝与浅拷贝(内存地址) 1.python中的可变对象与不可变对象 (1) 可变对象:dict,list def dict_test(): a = {} b = a print ...
- 【转】JAVA中的浅拷贝和深拷贝
原文网址:http://blog.bd17kaka.net/blog/2013/06/25/java-deep-copy/ JAVA中的浅拷贝和深拷贝(shallow copy and deep co ...
- python中的浅拷贝与赋值不同
Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块. 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deep ...
- Python 引用、浅拷贝、深拷贝解析
引用 Python是动态数据类型的语言,故在对变量进行赋值时是不用制定变量类型的. 或者说,你可以把变量赋值的过程,当作是贴一个标签,去引用该数据. 看下面的例子: In [54]: a=4 In [ ...
随机推荐
- 真实世界的脉络].(英)戴维.多伊奇.pdf
[真实世界的脉络].(英)戴维.多伊奇.pdf 宇宙.时间.生命.等等,如果用量子物理学.计算机科学.进化论.认识论将这些最基本而又复杂的问题纠缠在一起时,那将会是一幅什么样的图景呢?也许,我们穷尽一 ...
- JavaScript面向对象编程指南(四) 对象
第4章 对象 4.1 从数组到对象 对象的组成:变量名.{}.用逗号分割的属性.用冒号分割的键/值对. var f={ name:'alen', // 可以在属性名上加引号 age:12 }; 对象文 ...
- 从零开始设计数据大屏—基于Vue ZT
虽然已经决定这个项目用Wyn来做了,但是,了解一下如何从头开始写一个数据大屏还是挺有好玩的. ------------- 为什么要做数据大屏? 现如今的大数据逐渐发挥出了它的力量,并无形的改变着我们的 ...
- Linux技术图谱
- wap2app(一)-- 网站快速打包成app
工具:HBuilder,下载地址:http://www.dcloud.io/ 下载并安装HBuilder后,打开编辑器,选择:文件 -> 新建 -> 项目,出现如下图: 选择wap2app ...
- Android内存优化(二)解析Memory Monitor、Allocation Tracker和Heap Dump
前言 要想做好内存优化工作,就要掌握两大部分的知识,一部分是知道并理解内存优化相关的原理,另一部分就是善于运用内存分析的工具.本篇就来介绍内存分析工具:Memory Monitor.Allocatio ...
- Markdown:常用语法
1.标题 说明:一共可以6级标题,几级几个# 一级标题 #一级标题 2.代码 用前后扩上 Hello World! 3.代码块 用前后扩上 Hello World! 4.加粗 加粗了 **加粗了** ...
- Ext 日期格式化
//日期格式化 Date.prototype.Format = function (fmt) { var o = { , //月份 "d+": this.getDate(), // ...
- MyBatis笔记----@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class
使用MyBatis 3.4.1或者其以上版本 @Intercepts({ @Signature(type = StatementHandler.class, method = "prepa ...
- IntelliJ IDEA安装后需要必须做的一件事
把Alt+斜杆 删除 Ctrl+空格修改成 Alt+斜杆 Ctrl+空格用过输入法的人都应该知道为什么要做上面一件事