python3-深浅copy
转载:https://www.cnblogs.com/ctztake/p/8194275.html
术语
- 变量:是一个系统表的元素,拥有指向对象的连接空间。
- 对象:被分配的一块内存,存储其所代表的值。
- 引用:是自动形成的从变量到对象的指针。
- 注意:类型(int类型,long类型(python3已除去))对于对象,不是变量。
- 不可变对象:一旦创建就不可修改的对象,包括字符串,元组,数字。
- 可变对象:可以修改的对象,包括列表,字典。(可通过hash()来判断对象是否可变)
关于python3深浅拷贝,会以下面三个点来讲述。
先说下copy,这里定义的copy,是指在内存里完全是两块独立的内存空间(既id值不一样),如果两个变量是引用同一个对象的内存地址(id值一样),则不叫copy。
- 赋值
- 浅copy
- 深copy
数字和字符串
对于数字和字符串而言,赋值、深浅拷贝毫无意义,因为他们的值永远都会纸箱同一个内存地址。
# 导入copy模块 >>> import copy # 定义一个变量var1 >>> var1 = # 输出var1的内存地址 >>> id(var1) >>> var2 = var1 # var2的内存地址和var1相同 >>> id(var2) # 浅拷贝 >>> var3 = copy.copy(var1) # var3的内存地址和var1相同 >>> id(var3) # 深拷贝 >>> var4 = copy.deepcopy(var1) # var4的内存地址和var1相同 >>> id(var4)
其他数据类型
对于字典、元组、列表而言,进行赋值,深浅拷贝时,其内存地址的变化是不同的。
- 创建一个字典
var1
var1 = {, ]}
1.赋值
在python中对象的赋值其实就是对象的引用。当创建一个对象,把它赋值给另一个变量的时候,python并没有拷贝这个对象,只是拷贝了这个对象的引用而已。
>>> var1 = {, ]} >>> var2 = var1 >>> id(var1) >>> id(var2) 1937003361288##var1, var2引用的同一个字典对象(内存地址一样), 所以该字典的任何改动,都会影响到var1,var2
如图:
2.浅拷贝
浅拷贝: 浅拷贝值只拷贝一层,具有自己单独的内存地址。二层或其他层不拷贝,指向原有的内存地址。
# 导入拷贝模块 >>> import copy >>> var1 = {, ]} # 使用浅拷贝的方式 >>> var2 = copy.copy(var1) # 两个变量的内存地址是不一样的 >>> id(var1) >>> id(var2) # 但是他们的元素内存地址是一样的 >>> id(var1["k1"]) >>> id(var2["k1"]) 2084726207464 ##浅copy只拷贝一层,也就是'k1' 'k2'以及所对应的值完全是两份数据,没有关联,修改了var1的'k1',var2不会有影响。 对于'k3'的值来说,不属于第一次内容,所以修改会互相影响。
如图:
3.深copy
深拷贝,在内存中将所有的数据重新创建一份(排除最后一层,即:python内部对字符串和数字的优化)
# 导入拷贝模块 >>> import copy >>> var1 = {, ]} # 使用深拷贝的方式把var1的内容拷贝给var2 >>> var2 = copy.deepcopy(var1) # var1和var2的内存地址是不相同的 >>> id(var1) >>> id(var2) # var1和var2的元素"k3"内存地址是不相同的 >>> id(var1["k3"]) >>> id(var2["k3"])
# var1和var2的"k3"元素的内存地址是相同的 >>> id(var1["k3"][1]) 1706383265744 >>> id(var2["k3"][1]) 1706383265744
python3-深浅copy的更多相关文章
- python基础(三)编码,深浅copy
编码,深浅copy encode,decode在python2中使用的一些迷糊,python3中更容易理解 要理解encode和decode,首先我们要明白编码,字符和二进制的相关概念,简单来说,计算 ...
- Python学习之路基础篇--07Python基础+编码、集合 和 深浅Copy
1 小数据池(节省内存) 只有数字和字符串中内存,储存在同一个内存地址中 数字的范围在-5~256中,字符串有以下两个特点:不能含有特殊字符,还有就s*20 不是同一个地址,而要*21就不是了 2 编 ...
- python 浅析格式化输出和深浅copy
一,格式化输出 今天主要想记录一下关于格式化输出的例子,然后结合了自己的理解,分析如下: 格式是 :百分号+占位符 主要有三种使用形式:%s (其中s表示string)表示字符串 %d (其中d表 ...
- 数据结构中的列表、元组、字典、集合 ,深浅copy
数据结构:数据结构是计算机存储数据和组织数据的方式.数据结构是指相互之间存在一种或多种特定关系的数据元素的集合.在python中主要的数据类型统称为容器. 而序列(如列表.元组).映射(如字典).集合 ...
- python浅析格式化输出和深浅copy
一,格式化输出 今天主要想记录一下关于格式化输出的例子,然后结合了自己的理解,分析如下: 格式是 :百分号+占位符 主要有三种使用形式:%s (其中s表示string)表示字符串 %d (其中d表 ...
- python基础3(元祖、字典、深浅copy、集合、文件处理)
本次内容: 元祖 字典 浅copy和深copy 集合 文件处理 1.1元祖 元祖(tuple)与列表类似,不同之处在于元祖的元素不能修改,元祖使用小括号(),列表使用方括号[].元祖创建很简单,只需要 ...
- python学习笔记三 深浅copy,扩展数据类型(基础篇)
深浅copy以及赋值 对于字符串和数字而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. import copy n1 = #n1 = 'hahahaha' #赋值n2 = n1#浅co ...
- Python 第三篇(下):collections系列、集合(set)、单双队列、深浅copy、内置函数
一.collections系列: collections其实是python的标准库,也就是python的一个内置模块,因此使用之前导入一下collections模块即可,collections在py ...
- Python 基础之函数、深浅copy,set及练习
三元运算符通常在Python里被称为条件表达式,这些表达式基于真(true)/假(not)的条件判断,在Python 2.4以上才有了三元操作. 语法格式: X if C else Y 有了三元表达式 ...
- Python 集合 深浅copy
一,集合. 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. ...
随机推荐
- Spring Boot笔记四:日志框架介绍
我是一名程序员,我喜欢写System.out.println来打印一些重要的信息...后来我学了面向对象,我把这些输出语句整合到了一个工具类里面,可以打印,也可以保存日志. 我是一名积极思考的程序员, ...
- HDU - 6305 RMQ Similar Sequence(笛卡尔树)
http://acm.hdu.edu.cn/showproblem.php?pid=6305 题目 对于A,B两个序列,任意的l,r,如果RMQ(A,l,r)=RMQ(B,l,r),B序列里的数为[0 ...
- 2018牛客网暑期ACM多校训练营(第九场)A -Circulant Matrix(FWT)
分析 大佬说看样例就像和卷积有关. 把题目化简成a*x=b,这是个xor的FWT. FWT的讲解请看:https://www.cnblogs.com/cjyyb/p/9065615.html 那么要求 ...
- Bootstrap Web框架
Bootstrap 一.简介 Bootstrap是美国Twitter公司的设计师Mark Otto和Jacob Thornton合作基于HTML.CSS.JavaScript 开发的简洁.直观.强悍的 ...
- 细说java系列之反射
什么是反射 反射机制允许在Java代码中获取被JVM加载的类信息,如:成员变量,方法,构造函数等. 在Java包java.lang.reflect下提供了获取类和对象反射信息的相关工具类和接口,如:F ...
- Silverlight设计器——Path
如下图,在设计一个InfoWindow的时候,顶栏的关闭按钮没有出现.观察了半天,也没有弄明白.无意中,拖动一个几乎透明的信息框,突然就出现了关闭的按钮.原来,那个信息框只是一个Path,它遮住了关闭 ...
- GBK 字符集
什么是 GBK ? 中文名 汉字编码字符集 外文名 Chinese Internal Code Specification 全 称 <汉字内码扩展规范> GBK编码,是对GB2312 ...
- exec存储过程示例
假如存储过程为test,两个参数为aa,bb那么有以下两种写法,不要带括号EXEC [dbo].[test] @aa = 111, @bb = 222 exec test 111,222
- C#正则表达式匹配
1.匹配所有带括号的字符串 string s = "aaaa(bbb)ccc(ddd)eeee"; string pattern = "\\(\\w+\\)"; ...
- 调用waitpid的SIGCHLD信号处理函数
#include <stdio.h> #include <sys/wait.h> void sig_chld(int signo) { pid_t pid; int stat; ...