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
一,集合. 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. ...
随机推荐
- CSS样式链接和文字常用属性
行内: <div style="color:red;"></div> 内嵌<style>div{background-color:red;}&l ...
- Thymeleaf中的&&解析问题
1.问题: 最近使用了新的html模板thymeleaf..在模板里使用js语法时遇到问题,&&不能正确的被解析,使用if(a&&b){}可以通过模板解析,但是浏览器上 ...
- Linux top、VIRT、RES、SHR、SWAP(S)、DATA Memory Parameters Detailed
catalog . Linux TOP指令 . VIRT -- Virtual Image (KB) . RES -- Resident size (KB) . SHR -- Shared Memor ...
- SpringBoot笔记十六:ElasticSearch
目录 ElasticSearch官方文档 ElasticSearch安装 ElasticSearch简介 ElasticSearch操作数据,RESTful风格 存储 检查是否存在 删除 查询 更新 ...
- JAVA核心技术I---JAVA基础知识(数字相关类)
一:相关数字类 –整数 Short, Int, Long –浮点数 Float, Double –大数类 BigInteger(大整数), BigDecimal(大浮点数) –随机数类 Random ...
- 解决Lost connection to MySQL server during query错误方法
昨天使用Navicat for MySQL导入MySQL数据库的时候,出现了一个严重的错误,Lost connection to MySQL server during query,字面意思就是在查询 ...
- java.lang.String & java.lang.StringBuilder
java.lang.String & java.lang.StringBuilder String 成员方法 作用 public charAr(int index) 返回给定位置的代码单元 p ...
- mkdocs 生成帮助文档
简介 MkDocs 可以同时编译多个markdown文件,形成书籍一样的文件.有多种主题供你选择,很适合项目使用. MkDocs 是快速,简单和华丽的静态网站生成器,可以构建项目文档.文档源文件在 M ...
- Log4j2 快速开始
1.配置 默认 Log4j2可以将自己配置为记录错误及更高级别日志,并将消息记录到控制台中. [显示配置]1.检测log4j.configurationFile系统属性,如果属性存在,就从指定文件加载 ...
- hashMap源码解析(四)
---恢复内容开始--- 在上文中讲到了putval这个方法,这里继续: final V putVal(int hash, K key, V value, boolean onlyIfAbsent, ...