preface

这里主要说深浅拷贝的原理。首先说说数字与字符串作为内存对象的重用,请看代码:

a1=12345
b1=12345
a2=a1
print(id(a1),id(b1),id(a2))

打印出来的结果毫无疑问,ID值肯定是一样的。

这就说明在python中,如果内存中有同样的对象(数字与字符串类型),那么我们在申明的时候是直接引用之前有的对象。

浅拷贝

浅拷贝,我们先看代码

n1={'k1':'v1','k2':'v2','k3':{'he':'y1'}}
n2 = copy.copy(n1)
n3 = copy.deepcopy(n1)
print(id(n1),id(n2))
6754632 17766728
print(id(n1['k3']),id(n2['k3']))
6754504 6754504

由打印结果可得,两个字典的ID值不一样了,但是呢,字典包含的value值还是一样的,正如前文说的一样,每个字典的字符串和数字型的元素ID还是一样的,所以说两个字典所引用的元素还是同一个的。请注意看第三个元素,第三个元素的value为字典类型,但是ID值仍是一样的。这就说明了浅拷贝的一个特性,浅拷贝拷贝的时候会把第一层元素一块copy过去,像字典这样有里面还有元素的,浅拷贝就不能把第一层字典里的value再复制过去了。所以我们看第二个print打印出来的结果是一样的。请看下面的一个例子:

n1={'k1':'v1','k2':'v2','k3':{'he':'y1'}}
n2 = copy.copy(n1) n1['k3']['he'] = 'n1'
n2['k3']['he'] = 'n2'
print(n1,'\n',n2)
{'k1': 'v1', 'k2': 'v2', 'k3': {'he': 'n2'}}
{'k1': 'v1', 'k2': 'v2', 'k3': {'he': 'n2'}}

如上面的例子所示:由于浅拷贝是引用第一层元素,所以当我们修改n2的时候,也同时把n1修改了,因为他们的k3还是引用同一个值的。

深拷贝

先看代码:

n1={'k1':'v1','k2':'v2','k3':{'he':'y1'}}
n1['k3']['he'] = 'n1'
n3['k3']['he'] = 'n3'
print(n1,'\n',n3)
{'k3': {'he': 'n1'}, 'k1': 'v1', 'k2': 'v2'}
{'k3': {'he': 'n3'}, 'k1': 'v1', 'k2': 'v2'} print(id(n1['k3']),'\n',id(n3['k3']))
6426824
12110664

我们先看第一个print出来的结果,很显然,n3修改k3的值不会影响n1的k3的值,因为他们现在是两个不同的列表了,我们由第二个print出来的ID值可以看错来,两个k3的值不一样,所以谁也不影响谁,所以深拷贝就是能够把多层元素一块拷贝。

深拷贝 VS 浅拷贝

  • 深拷贝:就是能够把多层元素一块拷贝,后续修改第二层(第三层或者第四层等等)元素的值的时候,不会影响其他深拷贝出来的对象。
  • 浅拷贝:只能复制第一层元素,后续修改第二层(第三层或者第四层等等)元素的值的时候,也会影响其他浅拷贝出来的对象。

深浅拷贝的应用

假设我们有一个模版,内容如下:

info = {
'cpu':[19],
'mem':[87],
'disk':[10],
}

这个时候我们需要在这模版上增加对应的数据,那么就必须要使用深拷贝了,代码如下:

new_info = copy.deepcopy(info)
new_info['cpu'].extend([56,12,32])

打印出来的结果肯定不一样的。

python06 深浅拷贝原理的更多相关文章

  1. Python学习笔记——基础篇2【第三周】——计数器、有序字典、元组、单(双)向队列、深浅拷贝、函数、装饰器

    目录 1.Python计数器Counter 2.Python有序字典OrderredDict 3.Python默认字典default 4.python可命名元组namedtuple 5.Python双 ...

  2. Python原理 -- 深浅拷贝

    python原理 -- 深浅拷贝 从数据类型说开去 str, num : 一次性创建, 不能被修改, 修改即是再创建. list,tuple,dict,set : 链表,当前元素记录, 下一个元素的位 ...

  3. python学习笔记:深浅拷贝的使用和原理

    在理解深浅拷贝之前,我们先熟悉下变量对象和数据类型 1.变量和对象 变量-引用-对象(可变对象,不可变对象) 在python中一切都是对象,比如[1,2],'hello world',123,{'k1 ...

  4. python——赋值与深浅拷贝

    初学编程的小伙伴都会对于深浅拷贝的用法有些疑问,今天我们就结合python变量存储的特性从内存的角度来谈一谈赋值和深浅拷贝~~~ 预备知识一——python的变量及其存储 在详细的了解python中赋 ...

  5. 【 js 基础 】 深浅拷贝

    underscore的源码中,有很多地方用到了 Array.prototype.slice() 方法,但是并没有传参,实际上只是为了返回数组的副本,例如 underscore 中 clone 的方法: ...

  6. C++模板实现动态顺序表(更深层次的深浅拷贝)与基于顺序表的简单栈的实现

    前面介绍的模板有关知识大部分都是用顺序表来举例的,现在我们就专门用模板来实现顺序表,其中的很多操作都和之前没有多大区别,只是有几个比较重要的知识点需要做专门的详解. #pragma once #inc ...

  7. python--关于赋值与深浅拷贝的认识

    作为一个自学python的小白,平时用到深浅拷贝的机会很少,因此对其也是一知半解.但是,作为一个立志成为后端工程狮的男人,眼里揉不了沙子,于是专门花时间补了补课,在此记录一下学习心得.    在讲深浅 ...

  8. python深浅拷贝与赋值

    初学编程的小伙伴都会对于深浅拷贝的用法有些疑问,今天我们就结合python变量存储的特性从内存的角度来谈一谈赋值和深浅拷贝~~~ 预备知识一——python的变量及其存储 在详细的了解python中赋 ...

  9. day07 深浅拷贝

    今日概要 深浅拷贝(重点) 文件操作 详细内容 直接赋值: 直接将对象的引用赋值给另一个对象 v1=1000 v2=v1 #v1 v2指向同一个内存地址 print(id(v1),id(v2))#相等 ...

随机推荐

  1. golang后台任务库

    功能需求 本来想用linux自带的corntab,然而corn调试困难,而且不支持以下需求 能分布式 有http接口 能调试 有统计 kala 这个需求也不算小众,于是在网上查了一下,果然有,而且还比 ...

  2. MAMP和WAMP搭建Web环境,数据库,数据分布可视化

    MAMP和WAMP搭建Web环境,数据库,数据分布可视化 1. 数据库 用MAMP和WAMP搭建Web环境,数据分布可视化 Web环境Web服务器:Apache.Nginx,处理Web请求数据库:My ...

  3. Android 开发自己的网络收音机2——电台列表(SlidingMenu侧滑栏)

    上一篇文章总体规划了这个项目的情况,今天讲讲实现电台列表.今天其实主要想讲解的是SlidingMenu,也就是我们平时说的侧滑栏,现在很多应用都有用这种UI效果.SlidingMenu侧滑栏功能实现的 ...

  4. [转]为Kindeditor控件添加图片自动上传功能

    原文地址:http://www.cnblogs.com/jaxu/p/3824583.html Kindeditor是一款功能强大的开源在线HTML编辑器,支持所见即所得的编辑效果.它使用JavaSc ...

  5. Scala 闭包

    Scala 闭包 闭包是一个函数,返回值依赖于声明在函数外部的一个或多个变量. 闭包通常来讲可以简单的认为是可以访问一个函数里面局部变量的另外一个函数. 如下面这段匿名的函数: val multipl ...

  6. 【WPF】屏幕右下角消息提示框

    WPF做一个仿QQ的右下角消息提示窗,网上找到几个Demo后,选了一个比较好用的. 博客 http://blog.csdn.net/huangli321456/article/details/5052 ...

  7. Fiddler设置抓取FireFox火狐的包

    参考 http://blog.csdn.net/zhoutaohenan/article/details/8477993 亲测有效 Fiddler使用教程 http://blog.csdn.net/o ...

  8. mha切换脚本可用的

    #!/usr/bin/env perl use strict; use warnings FATAL => 'all'; use Getopt::Long; my ( $command, $ss ...

  9. Navi.Soft31.WebMVC框架(含示例地址)

    1概述 1.1应用场景 互联网高速发展,互联网软件也随之越来越多,Web程序越来越被广泛使用.它部署简单,维护方便,深得众多软件公司使用 Bootstrap前端框架,是最近非常流行的框架之一.它简洁, ...

  10. Navi.Soft31.阅读导航

    Navi.Soft31.核心类库 Navi.Soft31.WinForm框架 Navi.Soft31.WebMVC框架 Navi.Soft31.微信WinForm框架 Navi.Soft31.Mobi ...