转载:https://www.cnblogs.com/ctztake/p/8194275.html

术语

  • 变量:是一个系统表的元素,拥有指向对象的连接空间。
  • 对象:被分配的一块内存,存储其所代表的值。
  • 引用:是自动形成的从变量到对象的指针。
  • 注意:类型(int类型,long类型(python3已除去))对于对象,不是变量。
  • 不可变对象:一旦创建就不可修改的对象,包括字符串,元组,数字。
  • 可变对象:可以修改的对象,包括列表,字典。(可通过hash()来判断对象是否可变)

关于python3深浅拷贝,会以下面三个点来讲述。

先说下copy,这里定义的copy,是指在内存里完全是两块独立的内存空间(既id值不一样),如果两个变量是引用同一个对象的内存地址(id值一样),则不叫copy。

  1. 赋值
  2. 浅copy
  3. 深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的更多相关文章

  1. python基础(三)编码,深浅copy

    编码,深浅copy encode,decode在python2中使用的一些迷糊,python3中更容易理解 要理解encode和decode,首先我们要明白编码,字符和二进制的相关概念,简单来说,计算 ...

  2. Python学习之路基础篇--07Python基础+编码、集合 和 深浅Copy

    1 小数据池(节省内存) 只有数字和字符串中内存,储存在同一个内存地址中 数字的范围在-5~256中,字符串有以下两个特点:不能含有特殊字符,还有就s*20 不是同一个地址,而要*21就不是了 2 编 ...

  3. python 浅析格式化输出和深浅copy

    一,格式化输出 今天主要想记录一下关于格式化输出的例子,然后结合了自己的理解,分析如下: 格式是 :百分号+占位符 主要有三种使用形式:%s  (其中s表示string)表示字符串 %d  (其中d表 ...

  4. 数据结构中的列表、元组、字典、集合 ,深浅copy

    数据结构:数据结构是计算机存储数据和组织数据的方式.数据结构是指相互之间存在一种或多种特定关系的数据元素的集合.在python中主要的数据类型统称为容器. 而序列(如列表.元组).映射(如字典).集合 ...

  5. python浅析格式化输出和深浅copy

    一,格式化输出 今天主要想记录一下关于格式化输出的例子,然后结合了自己的理解,分析如下: 格式是 :百分号+占位符 主要有三种使用形式:%s  (其中s表示string)表示字符串 %d  (其中d表 ...

  6. python基础3(元祖、字典、深浅copy、集合、文件处理)

    本次内容: 元祖 字典 浅copy和深copy 集合 文件处理 1.1元祖 元祖(tuple)与列表类似,不同之处在于元祖的元素不能修改,元祖使用小括号(),列表使用方括号[].元祖创建很简单,只需要 ...

  7. python学习笔记三 深浅copy,扩展数据类型(基础篇)

    深浅copy以及赋值 对于字符串和数字而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. import copy n1 = #n1 = 'hahahaha' #赋值n2 = n1#浅co ...

  8. Python 第三篇(下):collections系列、集合(set)、单双队列、深浅copy、内置函数

     一.collections系列: collections其实是python的标准库,也就是python的一个内置模块,因此使用之前导入一下collections模块即可,collections在py ...

  9. Python 基础之函数、深浅copy,set及练习

    三元运算符通常在Python里被称为条件表达式,这些表达式基于真(true)/假(not)的条件判断,在Python 2.4以上才有了三元操作. 语法格式: X if C else Y 有了三元表达式 ...

  10. Python 集合 深浅copy

    一,集合. 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. ...

随机推荐

  1. Ipython Notebook ipynb文件转化为Python脚本

    欢迎关注博主主页,学习python视频资源 方法1. pycharm可以打开 方法2 https://jingyan.baidu.com/article/19192ad8edc736e53e57072 ...

  2. mybatis_异常

    1.HTTP Status 500 - Request processing failed; nested exception is org.apache.ibatis.binding.Binding ...

  3. Java开发中的编码分析__GET&POST

    GET方式提交参数分析 code.jsp <%@ page language="java" contentType="text/html; charset=UTF- ...

  4. scrapy 基础

    安装略过 创建一个项目 scrapy startproject MySpider #或者创建时存储日志scrapy startproject --logfile='../logf.log' MySpi ...

  5. FastDFS与springboot整合例子

    余庆先生提供了一个Java客户端,但是作为一个C程序员,写的java代码可想而知.而且已经很久不维护了. 这里推荐一个开源的FastDFS客户端,支持最新的SpringBoot2.0. 配置使用极为简 ...

  6. Linux 内核中的数据结构:基数树(radix tree)

    转自:https://www.cnblogs.com/wuchanming/p/3824990.html   基数(radix)树 Linux基数树(radix tree)是将指针与long整数键值相 ...

  7. redis使用问题一:Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisException: Could not get a resource from the pool] with root cause

    本文使用的是spring-data-redis 首先说下redis最简单得使用,除去配置. 需要在你要使用得缓存得地方,例如mybatis在mapper.xml中加入: <cache evict ...

  8. vue-if与vue-show的区别

    两者都是动态显示DOM元素   不同点: 1.使用方式 v-if是根据后面数据的真假,来判断DOM的添加删除等操作 v-show只是在修改元素的css样式(display属性值)   2.实现过程 v ...

  9. redis基本操作

    ''' pip install redis redis 可以看成内存中的大字典 redis五大数据类型 --> 指的是第一层的value值的类型 - 字符串 "k1" - 列 ...

  10. List<string>序列化与反序列化一个小坑

    Newtonsoft序列化与反序列化有两个重载方法,带<T>和不带<T>的 如果将一个List<String>序列化为jsonStr后,再反序列化,会变成JArra ...