**Python中的深拷贝和浅拷贝详解
Python中的深拷贝和浅拷贝详解
甚至连type其本身都是对象,type对象
Python中变量与C/C++/Java中不同,它是指对象的引用,Python是动态类型,程序运行时候,会根据对象的类型
来确认变量到底是什么类型。
单独赋值: 比如说:
在运行a=3后,变量a变成了对象3的一个引用。在内部,变量事实上是到对象内存空间的一个指针
因为Python的变量不过是对象的引用,或指向对象的指针,因此在程序中可以经常改变变量引用
>>> x = 'Hello' #现在又成了字符串
>>> x = [1,2,3] #现在又成了列表
专业表述如下:
变量是一个系统表的元素,拥有指向对象的连接的空间
对象是被分配的一块内存,存储其所代表的值
引用是自动形成的从变量到对象的指针
特别注意: 类型属于对象,不是变量
比如像刚才的a=3, 整数对象3包含了两重信息
1.值为3
2.一个头部信息:告诉Pthyon,这是个整数对象[相当于一个指向int的指针]
共享引用: 比如说:
>>> b = a
在运行赋值语句b = a之后,变量a和变量b指向了同一个对象的内存空间.
从上图可以看到,a和b,其id完全一样,指向同一个整数对象3,或者说同一块内存
如果删掉a后, 不会影响b
拷贝概念的引入就是针对:可变对象的共享引用潜在的副作用而提出的.
【可变对象-不可变对象】
在Python中不可变对象指:一旦创建就不可修改的对象,包括字符串,元祖,数字
在Python中可变对象是指:可以修改的对象,包括:列表、字典
上面说的a,b都是整数,整数是不可变对象,如果是可变对象的话,就是另外一回事了。
>>> L2 = L1 #将L1值赋给L2后,两者共享引用同一个列表对象[1,2,3,4]
>>> L1[0] = 200 #因为列表可变,改变L1中第一个元素的值
>>> L1; L2 #改变后,L1,L2同时改变,因为对象本身值变了
[200, 3, 4]
[200, 3, 4]
如果不想改变列表L2的值,有两种方法:切片 和 copy模块
>>> L2 = L1
>>> id(L1);id(L2) #共享引用一个可变对象
45811784L
45811784L
>>> L2 = L1[:] #切片操作
>>> id(L1);id(L2) #切片后,对象就不一样了
45811784L
45806920L
>>> L1[0] = 200
>>> L1;L2 #L1发生改变,L2没有变化
[200, 3, 4]
[2, 3, 4]
【拷贝】
1. 切片技术应用于所有的序列,包括:列表、字符串、元祖
>>>但切片不能应用于字典。对字典只能使用D.copy()方法或D.deepcopy()方法.
2. 深浅拷贝,即可用于序列,也可用于字典
>>> X = copy.copy(Y) #浅拷贝:只拷贝顶级的对象,或者说:父级对象
>>> X = copy.deepcopy(Y) #深拷贝:拷贝所有对象,顶级对象及其嵌套对象。或者说:父级对象及其子对象
如果字典只有顶级对象:
如果字典中嵌套对象:
【结论】
如果源对象只有一级目录的话,源做任何改动,不影响深浅拷贝对象
如果源对象不止一级目录的话,源做任何改动,都要影响浅拷贝,但不影响深拷贝
**Python中的深拷贝和浅拷贝详解的更多相关文章
- 【转】 c++拷贝构造函数(深拷贝,浅拷贝)详解
c++拷贝构造函数(深拷贝,浅拷贝)详解 2013-11-05 20:30:29 分类: C/C++ 原文地址:http://blog.chinaunix.net/uid-28977986-id-3 ...
- 【C++】拷贝构造函数(深拷贝,浅拷贝)详解
一.什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: ; int b = a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量. 下面看一个类对 ...
- python中argparse模块用法实例详解
python中argparse模块用法实例详解 这篇文章主要介绍了python中argparse模块用法,以实例形式较为详细的分析了argparse模块解析命令行参数的使用技巧,需要的朋友可以参考下 ...
- Python中random模块生成随机数详解
Python中random模块生成随机数详解 本文给大家汇总了一下在Python中random模块中最常用的生成随机数的方法,有需要的小伙伴可以参考下 Python中的random模块用于生成随机数. ...
- python中requests库使用方法详解
目录 python中requests库使用方法详解 官方文档 什么是Requests 安装Requests库 基本的GET请求 带参数的GET请求 解析json 添加headers 基本POST请求 ...
- Python中的变量和作用域详解
Python中的变量和作用域详解 python中的作用域分4种情况: L:local,局部作用域,即函数中定义的变量: E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部 ...
- Python中%r和%s的详解及区别_python_脚本之家
Python中%r和%s的详解及区别_python_脚本之家 https://www.jb51.net/article/108589.htm
- python中的subprocess.Popen()使用详解---以及注意的问题(死锁)
从python2.4版本开始,可以用subprocess这个模块来产生子进程,并连接到子进程的标准输入/输出/错误中去,还可以得到子进程的返回值. subprocess意在替代其他几个老的模块或者函数 ...
- 第7.15节 Python中classmethod定义的类方法详解
第7.15节 Python中classmethod定义的类方法详解 类中的方法,除了实例方法外,还有两种方法,分别是类方法和静态方法.本节介绍类方法的定义和使用. 一. 类方法的定义 在类中定 ...
随机推荐
- BD09坐标(百度坐标) WGS84(GPS坐标) GCJ02(国测局坐标) 的相互转换
BD09坐标(百度坐标) WGS84(GPS坐标) GCJ02(国测局坐标) 的相互转换 http://www.cnphp6.com/archives/24822 by root ⋅ Leave a ...
- C# Post发送数据返回页面结果
public string GetPage(string posturl, string postData) { Stream outstream = null; Stream instream = ...
- pid参数调节的几句话
如果参数上升太快,降低Kp值,如果震荡太剧烈(振荡幅度过大),降低Ki值,如果曲线震荡部分上升下降太快则尝试调整Kd值.
- 随机生成国内ip
function rand_ip(){ $ip_long = array( array('607649792', '608174079'), //36.56.0.0-36.63.255.255 arr ...
- toxiproxy 安装试用
备注: 实际上是一个代理工具,但是又不是简单的进行代理(tcp,可以配置策略,toxics 实现延迟,模拟故障, 对于这个大家可能了解的就是netflix 公司的chaos monkey, ...
- 我的 SONY MP3 NWZ-B105F
我的 SONY MP3 NWZ-B105F 只有 2GB 的容量,好像2007年出来的,现在还可以开机和播放. 使用的 SigmaTel 的方案 BGA 的封装,1.1inch 屏幕竟然是彩屏,锂电池 ...
- Hadoop HDFS 整合 上传 下载 删除
新建一个Java项目,导入jar,新建一个测试类,编写代码实现文件操作功能: package com.bw.test; import java.io.FileInputStream; import j ...
- 数组去重(初识ES6)
较常见的一问题:数组去重. 方法一:利用hash数组的原理 var arr=[1,3,3,4,5,5,6,6,7,8,69,8,99,9,0,]; function unique(arry){ var ...
- 如何在项目中使用requireJS
本文主要讲讲如何在一个项目中合理的使用requireJS,来加载js代码,这里是个实际例子,讲解不多, 看详情请连接到:http://www.cnblogs.com/evaling/p/6722760 ...
- volatile浅析
volatile的意思是不稳定的.易变的,但在多线程中却跟字面意思一毛钱关系没有.作为一个变量修饰符,它主要有两个作用:一个是告诉大家,该变量是一个在多个线程之间均可见的变量:另一个是告诉java虚拟 ...