在理解深浅拷贝之前,我们先熟悉下变量对象和数据类型
1.变量和对象
变量-引用-对象(可变对象,不可变对象)
在python中一切都是对象,比如[1,2],'hello world',123,{'k1':'v1'},
比如说:
>>> a = 3
专业表述如下:
变量是一个系统表的元素,拥有指向对象的连接的空间
对象是被分配的一块内存,存储其所代表的值
引用是自动形成的从变量到对象的指针
特别注意: 类型属于对象,不是变量
共享引用: 比如说:
>>> a = 3
>>> b = a
在运行赋值语句b = a之后,变量a和变量b指向了同一个对象的内存空间.
2.数据类型
在python中数据类型包括:int,bool,float,str,dict,tuble,set,list等等,
 首先,我们需要知道在python中哪些是可变数据类型,哪些是不可变数据类型。可变数据类型:列表list和字典dict;不可变数据类型:整型int、浮点型float、字符串型string和元组tuple。
用一句话来概括上述过程就是:“python中的不可变数据类型,不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象,而对于相同的值的对象,在内存中则只有一个对象,内部会有一个引用计数来记录有多少个变量引用这个对象;可变数据类型,允许变量的值发生变化,即如果对变量进行append、+=等这种操作后,只是改变了变量的值,而不会新建一个对象,变量引用的对象的地址也不会变化,不过对于相同的值的不同对象,在内存中则会存在不同的对象,即每个对象都有自己的地址,相当于内存中对于同值的对象保存了多份,这里不存在引用计数,是实实在在的对象。
3.对于数字和字符串来说,无论通过赋值,浅拷贝还是深拷贝,同一个值永远用的是同一个内存地址。
import copy
a = "i love python"
b = a
a1 = copy.copy(a)
a2 = copy.deepcopy(b)
print(id(a))
print(id(b))
print(id(a1))
print(id(a2))
#输出:
2114011486192
2114011486192
2114011486192
2114011486192

4.对于字典,列表等可变对象:
例1,关于赋值,只是创建一个变量,该变量仍指向原来内存地址;
#赋值
D = {'k1':'v1','k2':123,'k3':["str1",469]}
D2 = D
print(id(D))
print(id(D2))
#输出:
2178677065032
2178677065032

例2,浅拷贝,

#浅拷贝
D = {'k1':'v1','k2':123,'k3':["str1",469]}
D2 = copy.copy(D) #浅拷贝,额外创建第一层(变量名id改变,对象id不变,还是引用旧对象)
print(id(D))
print(id(D2))
print(id(D["k1"]))
print(id(D2["k1"]))
#输出;
1993456403784
1993456836488
1993456800856
1993456800856

例3:深拷贝,在内存中将所有的数据重新创建一份,值的存放位置不变。
D = {'k1':'v1','k2':123,'k3':["str1",469]}
D2 = copy.deepcopy(D)
print(id(D))
print(id(D2))
print(id(D["k3"]))
print(id(D2["k3"]))
print(id(D["k3"][0]))
print(id(D2["k3"][0]))
#输出:
2129861461320
2129861875016
2129863354440
2129863327624
2129861860856
2129861860856

 5.应用:
#浅拷贝,改变新字典,久字典也一起改变
dict = {"cpu":[100],"mem":[200],"disk":[300]}
new_dict = copy.copy(dict)
new_dict["cpu"][0] = 90
print(new_dict)
print(dict)
#输出:
{'cpu': [90], 'mem': [200], 'disk': [300]}
{'cpu': [90], 'mem': [200], 'disk': [300]}
#深拷贝,改变新字典,久字典没变
dict = {"cpu":[100],"mem":[200],"disk":[300]}
new_dict = copy.deepcopy(dict)
new_dict["cpu"][0] = 90
print(new_dict)
print(dict)
#输出:
{'cpu': [90], 'mem': [200], 'disk': [300]}
{'cpu': [100], 'mem': [200], 'disk': [300]}

参考:

http://www.cnblogs.com/repo/p/5425774.html

http://blog.csdn.net/jerry_1126/article/details/41852591

python学习笔记:深浅拷贝的使用和原理的更多相关文章

  1. Python学习(006)-深浅拷贝及集合

     深浅拷贝 import copy husband=['xiaoxin',123,[200000,100000]] wife=husband.copy() #浅拷贝 wife[0]='xiaohong ...

  2. python学习之深浅拷贝

    4.2 深浅拷贝 4.2.1 认识 首先应该知道python中变量在内存中是怎么存放的! 在python中,变量与变量的值占用不同的内存.变量占用的内存,并非直接存储数值,而存储的是值在内存中的地址. ...

  3. Python学习 :深浅拷贝

    深浅拷贝 一.浅拷贝 只拷贝第一层数据(不可变的数据类型),并创建新的内存空间进行储蓄,例如:字符串.整型.布尔 除了字符串以及整型,复杂的数据类型都使用一个共享的内存空间,例如:列表 列表使用的是同 ...

  4. Python学习-列表深浅拷贝

    一.先看一个简单的赋值语句 lst1 = ['France', 'Belgium', 'England'] lst2 = lst1 # lst1.append('Uruguay') lst2.appe ...

  5. python基础学习笔记——深浅拷贝

    2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 lst1 = ["⾦⽑狮王", "紫衫⻰王&qu ...

  6. day8 python学习 集合 深浅拷贝

    1.内存地址: 字符串在20位以内,没有空格,没有特殊字符的情况下,同样的字符串内存地址是一样的 2.元组中:在只有一个值的时在后边加逗号和没有逗号的区别 t1=(1) 不加逗号这个值是什么类型就打印 ...

  7. python学习笔记3---浅拷贝和深拷贝,file操作

    import copy a=[1,2,3,['a','b']] b=a c= copy.copy(a)---浅拷贝 d=copy.deepcopy(a)---深拷贝 file操作: python 文件 ...

  8. python学习day7 深浅拷贝&文件操作

    4-4 day07 深浅拷贝&文件操作 .get()用法 返回指定键的值,如果值不在字典中返回默认值. info={'k1':'v1,'K2':'v2'}mes = info.get('k1' ...

  9. python学习笔记:*args和**kwargs使用原理?

    一.*args和**kwargs原理 先看个例子: def test(*args,**kwargs): print("args =",args) print("kwarg ...

  10. Python学习笔记基础篇——总览

    Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列 ...

随机推荐

  1. linux系统下Nagios+rrdtool+Pnp4nagios监控环境的搭建

    环境中的软件版本>>>>>>>>>>>>>>>>>>nagios版本:3.5.1rrdtoo ...

  2. [破解] IPhone 5S icloud dns bypass

    http://ui.iclouddnsbypass.com/deviceservices/buddy/barney_activation_help_en_us.buddyml http://www.j ...

  3. python set和get实现

    import math class Square: # 正方形 def __init__(self, l): self.length = l # 边长 def __setattr__(self, ke ...

  4. webstorm安装 利用host破解

    1.官网下载,一路确定(其中最近一版还下载个什么玩意,不要取消,取消后即使安装了也报错找不到jvm的环境变量), 2  打开webstorm,首次使用前accept -->dont sent - ...

  5. Unity 为队伍设置不同颜色的shader

    在魔兽争霸等一些游戏中,我们通过模型的颜色就能很轻松的区分队伍,如下:   实现的方法有很多,比如: 1,为不同队伍各出一张不同颜色的贴图(Hmmm,war3有的地图可以容纳12只队伍,美术大大们会很 ...

  6. js设计模式(六)---命令模式

    命令模式算是最简单.优雅的模式之一了,命令模式中的命令指的是一个执行某些特定事情的指令.目的是吧请求发送者和请求接受者解耦, 就像点餐,顾客只需要发送菜单,谁去接收,不用考虑.厨师接收到命令开始做菜, ...

  7. particles.js中文开发手册

    2017年6月17日01:06:28 因为自己需要做产品,所以一个好的UI界面也是很重要的,发现这种散射的原子颗粒特效还不错,就弄了一个 官方github:https://github.com/Vin ...

  8. [No0000197]Windows用户都应该知道的运行命令

    通过"运行"命令,运行Windows丰富工具的方法.如果您知道工具或任务的相应"运行"命令,那么您就知道访问所述工具或任务的最快方法. 以下是我们最喜欢的Run ...

  9. [人工智能] 安装python jupyter

    1.  什么是python jupyter ? 简单的说,可以理解为一个IDE. http://jupyter.org/ 2.  安装python jupyter notebook http://ju ...

  10. eclipse 安装 lombok插件

    下载插件 官网下载 :https://projectlombok.org/ 有些小伙伴官网可能打不开,现提供我的下载地址:https://files.cnblogs.com/files/niceyoo ...