我的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 ...
随机推荐
- bzoj 1047 : [HAOI2007]理想的正方形 单调队列dp
题目链接 1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2369 Solved: 1266[Submi ...
- GPL协议
GPL-General Public License 它是自由软件许可(Free Software Licence),保证最终使用者能够自由的引用,学习,拷贝,甚至修改软件.在理解这之前需要了解什么是 ...
- BZOJ 3038 上帝造题的七分钟2 (并查集+树状数组)
题解:同 BZOJ 3211 花神游历各国,需要注意的是需要开long long,还有左右节点需要注意一下. #include <cstdio> #include <cmath> ...
- Java中有关构造函数的一道笔试题解析
Java中有关构造函数的一道笔试题解析 1.详细题目例如以下 下列说法正确的有() A. class中的constructor不可省略 B. constructor必须与class同名,但方法不能与c ...
- CSS3学习笔记之linear-gradient
我觉得CSS3很不错,自己也稍微看过,并且尝试过一些属性.对我自己而言,我没有勇气说我学过CSS3,我觉得任何自己看来很小的事情,也只是站在自己的角度来评判.就算的是"简单的"HT ...
- ASP.NET 操作配置文件
1.配置文件的各种操作 http://www.cnblogs.com/shimeng3344518/archive/2007/04/23/723999.html 2. http://www.jb51. ...
- PHP 导入excel
db.php为数据库操作类, $config为数据库配置,PHPExcel版本为PHPExcel_1.8.0, PHP代码: header("Content-type:text/html; ...
- [LeetCode]题解(python):063-Unique Paths II
题目来源: https://leetcode.com/problems/unique-paths-ii/ 题意分析: 这题的规则和上一题一样.给一个m×n的矩阵0,1矩阵.0代表可以经过,1代表不可以 ...
- geoserver图层属性查询及查询结果转换为arcgis js api能使用的格式
一个项目使用了ArcGIS JS API开发GIS展示层,但GIS服务使用了Geoserver,这时加载Geoserver数据和查询数据就和之前完全不一样了,以下介绍下我使用ArcGIS JS API ...
- Subsets 【dfs】
Given a set of distinct integers, nums, return all possible subsets. Note: Elements in a subset must ...