python中的浅拷贝和深拷贝
1、赋值语句
a = 'abc'
b = a
print id(a)
print id(b) # id(a):29283464
# id(b):29283464
通过简单的复制,我们可以看到,a b其实是一个对象。
对象赋值实际上是简单的对象引用,也就是说,当你创建了一个对象,然后把它赋值给另一个变量时,python并没有拷贝这个对象,而是拷贝了这个对象的引用。
aaarticlea/png;base64,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" alt="" width="591" height="128" />
2、浅拷贝
序列类型的对象默认类型拷贝是浅拷贝,通过以下几种方式实施:
(1) 完全切片操作[:]
(2) 利用工厂函数,例如list() 、dict()等
(3) 使用copy模块中的copy函数
创建一个列表对象,然后分别用切片操作和工厂方法拷贝对象,然后使用id()内建函数来显示每个对象的标识符。
s = ['abc',['def',1]]
a = s[:]
b= list(s)
print [id(x) for x in s,a,b]
#[29262792.29238576,28957272]
可以看到创建了三个不同的列表对象。在对对象的每一个元素进行操作:
a[0] = 'a'
b[0] = 'b'
print a,b
# (['a',['def',1]],['b',['def',1]]) a[1][1] = 0
print a,b
# (['a',['def',0]],['b',['def',0]])
我们可以看到,当执行a[1][1] = 0时,b[1][1]也跟着变为0。这是因为我们仅仅做了一个浅拷贝,对一个对象进行浅拷贝其实是新创建了一个类型跟原对象一样,它的内容元素是原来对象元素的引用,换句话说,这个拷贝的对象是新的,但他的内容还是原来的。这就是浅拷贝。
但是我们看到a的第一个元素,即字符串被赋值后,并没有影响b的。这是因为在这个对象中,第一个字符串类型是不可变的,第二个列表对象是可变的。正因为如此,当进行浅拷贝时,字符串被显式的拷贝,并创建了一个新的字符串对象,而列表元素只是把它的引用复制了,并不是他的成员。
#改变前
print [id(x) for x in a]
#[29563284,27843874]
print [id(x) for x in b]
#[29563284,27843874] #改变后
print [id(x) for x in a]
#[23464734,27843874]
print [id(x) for x in b]
#[29884656,27843874]
3 深拷贝
根据上面的例子,如果我们想要在改变a时不影响到b,要得到一个完全拷贝或者说深拷贝(一个新的容器对象,包含原有对象元素全新拷贝的引用),就需要copy.deepcopy()函数。
import copy
s = ['abc',['def',1]]
a = copy.deepcopy(s)
b = copy.deepcopy(s)
print [id(x) for x in s,a,b]
#[29278336,29262792,29238576] a[0] = 'a'
b[0] = 'b'
a[1][1] = 0
print a,b
#(['a',['def',0]],['b',['def',1]])
需要注意的是:第一,非容器类型(比如数字、字符串和其他“原子”类型的对象,像代码、类型和xrange对象等)没有拷贝一说,浅拷贝是用完全切片操作来完成的。
第二:如果元组变量只包含原子类型对象,对他的拷贝将不会进行,即使使用深拷贝操作也只能得到一个浅拷贝。
python中的浅拷贝和深拷贝的更多相关文章
- python中的浅拷贝,深拷贝
直接引用,间接引用 # 1.列表存储的是索引对应值的内存地址,值会单独的开辟一个内存空间 list = ["a","b"] 内存里面存储的就是list[0],l ...
- 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 中的浅拷贝和深拷贝
1. 列表和字典,直接赋值,都是浅拷贝,即赋值双方指向同一地址,因为 Python 对可变对象按引用传递. >>> a = [1, 2, 3] >>> b = a ...
- 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 [ ...
随机推荐
- TCP/IP BOOKS
TCP/IP Fundamentals for Microsoft Windows: Overview https://technet.microsoft.com/en-us/library/bb72 ...
- Web跨域问题总结
一.跨域问题的由来为了防止某些文档或脚本加载别的域下的未知内容造成泄露隐私,破坏系统等安全行为,1995年, Netscape 公司在浏览器中引入同源策略/SOP(Same origin policy ...
- sqlserver和Oracle内部的错误数据修复(DBCC、DBMS_REPAIR)
数据库长时间运行后,因断电.操作系统.物理存储等的原因可能会造成数据库内部的逻辑或物理错误,我们可以使用一般的方式尝试修复. 对于sqlserver 我们可以使用DBCC命令: -- sqlserve ...
- iis 7.5 0x80004005 静态文件 html、js、css 500错误
环境:iis 7.5 win7 64位 vs2012 问题:本地环境F5直接运行,没有任何问题,发布到IIS,静态文件不能访问,出现500错误,网上找了一堆解决办法,排除路径不正确,iis全部功能勾了 ...
- 单例实现c++
#include <iostream> using namespace std; class Singleton { public: static Singleton *GetInstan ...
- 关于 iOS 10 中 ATS 的问题
本文于 2016 年 11 月 28 日按照 Apple 最新的文档和 Xcode 8 中的表现进行了部分更新. WWDC 15 提出的 ATS (App Transport Security) 是 ...
- SDWebImage总结
SDWebImage 支持异步的图片下载+缓存,提供了 UIImageView+WebCache的 category,方便使用. 优点:首先NSURLCache是缓存原始数据(raw data)到磁盘 ...
- Flex air修改外部xml文件 (转)
AIR的文件操作不难,看完教程应该可以满足你对文件的所有基本操作.这篇教程主要以实际操作中遇到的情况来讲解 我们想想文件操作都会有什么内容,无非是创建,修改,删除,移动,拷贝.在这个过程中我们会涉及到 ...
- Unity关于获取游戏对象
我觉得Unity里面的Transform 和 GameObject就像两个双胞胎兄弟一样,这俩哥们很要好,我能直接找到你,你也能直接找到我.我看很多人喜欢在类里面去保存GameObject对象.解决G ...
- Linux上分析java程序的问题
通过日志看不出来的问题,可以通过看java的堆栈信息(dump文件)来看出一些端倪. 1. 找java的进程id.jdk/bin的目录 ps -ef | grep java 2. cd 到bin的目录 ...