我的Python成长之路---第三天---Python基础(11)---2016年1月16日(雾霾)
三、深浅拷贝
在Python中将一个变量的值传递给另外一个变量通常有三种:赋值、浅拷贝以及深拷贝
讨论深浅拷贝之前我们把Python的数据类型分为基本数据类型包括数字、字符串、布尔以及None等,还有一种像列表、元祖、字典等属于有基本数据类型作为最基本的元素组成的
在Python中基本数据类型的赋值、浅拷贝及深拷贝没有任何意义,都是指向同一块内存地址,也不存在层次的问题
>>> import copy
>>> n1 = 'abc'
>>> n2 = n1
>>> n3 = copy.copy(n1)
>>> n4 = copy.deepcopy(n1)
>>> id(n1)
140350336680040
>>> id(n2)
140350336680040
>>> id(n3)
140350336680040
>>> id(n4)
140350336680040
说明:Python的copy模块的copy和deepcopy函数分别为我们实现了浅拷贝和深拷贝,我们可以看到,赋值、浅拷贝和深拷贝他们最后的id(Python内存地址的表达方式)都是一样的,没有分别
现在讨论其他的字典,列表等这些非基本数据类型对象的赋值、浅拷贝及深拷贝的区别
假设我们有这么一个字典n1 = {"k1": "abc", "k2": 123, "k3": ["abc", 123]}
1、赋值
我们知道赋值及时将变量的内存赋个另一个变量,让另一个变量指向那个内存地址

>>> n1 = {"k1": "abc", "k2": 123, "k3": ["abc", 123]}
>>> id(n1)
140350328984328
>>> n2 = n1
>>> id(n2)
140350328984328 # 可以看到内存地址和n1是完全一样的
2、浅拷贝
浅拷就是在内存中将第一层额外开辟空间进行存放

>>> n3 = copy.copy(n1)
>>> id(n3)
140350328986504 # 可以看n3的内存地址已经和n1不同了
但是如果我们继续深入看一下n3里面的第二层的非基本数据类型的元素
>>> id(n1['k3'])
140350328603976
>>> id(n3['k3'])
140350328603976 # 字典里的列表还是指向同一个列表
3、深拷贝
深拷贝就是在内存中将数据从新创建一份,不仅仅是第一层,第二层、第三层...都会重新创建一份

>>> id(n1['k3'])
140350328603976
>>> id(n4['k3'])
140350328604296 # 可以看到第二层的列表也拷贝了一份,内存地址已经完全不一样
注意:这仅局限于非基本数据类型,基本数据类型还会是同一个内存地址
>>> id(n1['k1'])
140350336680040
>>> id(n4['k1'])
140350336680040
我的Python成长之路---第三天---Python基础(11)---2016年1月16日(雾霾)的更多相关文章
- 我的Python成长之路---第三天---Python基础(13)---2016年1月16日(雾霾)
五.Python的常用的内置函数 Python为我们准备了大量的内置函数,如下图所示 这里我们只讨论红框内的内置函数 abs(x) 返回一个数的绝对值(模),参数可以是真说或浮点数 >>& ...
- 我的Python成长之路---第三天---Python基础(12)---2016年1月16日(雾霾)
四.函数 日常生活中,要完成一件复杂的功能,我们总是习惯把“大功能”分解为多个“小功能”以实现.在编程的世界里,“功能”可称呼为“函数”,因此“函数”其实就是一段实现了某种功能的代码,并且可以供其它代 ...
- 我的Python成长之路---第三天---Python基础(10)---2016年1月16日(雾霾)
二.collections collections是对Python现有的数据类型的补充,在使用collections中的对象要先导入import collections模块 1.Counter——计数 ...
- 我的Python成长之路---第三天---Python基础(9)---2016年1月16日(雾霾)
一.集合 set和dict类似,也是一组key的集合,但不存储value.由于key不能重复,所以,在set中,没有重复的key. 集合和我们数学中集合的概念是一样的,也有交集,并集,差集,对称差集等 ...
- 我的Python成长之路---第七天---Python基础(22)---2016年2月27日(晴)
socket网络编程 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. ...
- python成长之路第三篇(1)_初识函数
目录: 函数 为什么要使用函数 什么是函数 函数的返回值 文档化函数 函数传参数 文件操作(二) 1.文件操作的步骤 2.文件的内置方法 函数: 一.为什么要使用函数 在日常写代码中,我们会发现有很多 ...
- python成长之路第三篇(4)_作用域,递归,模块,内置模块(os,ConfigParser,hashlib),with文件操作
打个广告欢迎加入linux,python资源分享群群号:478616847 目录: 1.作用域 2.递归 3.模块介绍 4.内置模块-OS 5.内置模块-ConfigParser 6.内置模块-has ...
- python成长之路——第三天
一.collections系列: collections其实是python的标准库,也就是python的一个内置模块,因此使用之前导入一下collections模块即可,collections在pyt ...
- 我的Python成长之路---第七天---Python基础(21)---2016年2月27日(晴)
四.面向对象进阶 1.类方法 普通的方法通过对象调用,至少有一个self参数(调用的时候系统自动传递,不需要手工传递),而类方法由类直接调用,至少有一个cls参数,执行时,自动将调用该方法的类赋值个c ...
随机推荐
- javascript 未结束的字符串常量
1.JAVASCRIPT引用时,使用的字符语言不一致. 比如:<script type=”text/javascript” src=”xxx.js” charset=”UTF-8″>.xx ...
- 我的Python成长之路---第一天---Python基础(4)---2015年12月26日(雾霾)
五.数据运算与数据运算符 1.算术运算符 算术运算符 运算符 描述 示例 + 加法 >>> 14 - 5 9 - 减法 >>> 14 - 5 9 * 乘法 &g ...
- 深究带PLL的错误复位设计
PLL复位通常犯的错误 或者是像上一篇文章 FPGA知识大梳理(四)FPGA中的复位系统大汇总 中的图一样,也是错误设计.为何呢?看ALTPLL (Phase-Locked Loop) IP Cor ...
- 泛型 "new的性能"
完美的.net泛型也有特定的性能黑点?追根问底并且改善这个性能问题 完美的.net真泛型真的完美吗 码C#多年,不求甚解觉得泛型就是传说中那么完美,性能也是超级好,不错,在绝大部分场景下泛型表现简直可 ...
- 转:js不同类型对象的比较规则
Type(x) Type(y) Result type(x)==type(y) x===y otherwise... false null undefined true undefined null ...
- MinGW 编译zlib、libpng、libjpeg、libcurl等(全都是Qt项目)
MinGW 这里使用的是Qt5自带的MinGw版本,将路径D:\Qt\Qt5.1.0\Tools\mingw48_32\bin加到"环境变量"→"系统变量"→& ...
- HDU 1091 A+B for Input-Output Practice (III)
#include <cstdio> int main() { int a,b; while(scanf("%d%d",&a,&b)!=EOF) if ( ...
- ACM_HDU 1231 最大连续子序列 (dp)_代码分析
Problem Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i < ...
- webservice的讲解
Web Service实践之——开始XFire 一.Axis与XFire的比较 XFire是与Axis2 并列的新一代WebService平台.之所以并称为新一代,因为它: 1.支持一系列Web Se ...
- android中使用surfaceview+MediaPlayer播放视频
Android中播放视频主要有两种方式: 使用其自带的播放器.指定Action为ACTION_VIEW,Data为Uri,Type为其MIME类型 使用android自带的VideoView,这种方法 ...