再说拷贝之前先说一说 is 与 ==

is 的作用是 比较两个引用是否为一个地址

== 是比较两个值

对变量 a  变量 b  都赋值为 2 : a 与 b 的值相等我们都可以理解,但是a与b引用地址也相同是为什么呢?

a和b中实际存储的就是一条地址,因为都赋值为2,所以就都存了内存单元中2的地址。也就是说如果增加一个变量c ,另c=a或c=b,那么c也指向的是2的内存地址;

接下来说拷贝,拷贝与 ‘=’ 赋值不同,拷贝是在建立一个空间,与原有的内容断开了联系。

深拷贝与浅拷贝:

进行拷贝首先引入copy模块  import copy

浅拷贝: copy.copy()

例如 a = copy.copy(b)

说到这里可能有人发现了一些小错误,不是说拷贝是另建空间吗?怎么使用了拷贝后 b is a 还是true?

这里有涉及到了python对内存操作中的一点小知识:

在 python 中数字 字符串,元组这些是不可变类型的,他们在内存中如果创建了地址就是固定的,如果另一个变量值也为这些,那么就会指向这个地址而不会再创建。所以即使使用了copy,也还是这个地址。而像列表等可变类型就会是另一种结果:

      

用一个可变类型列表来分别执行浅拷贝与赋值操作这样对比是不是更加容易理解呢

浅拷贝只是对于一个对象的顶层拷贝:

什么是顶层拷贝呢? 举个栗子:

对列表a进行拷贝  ,b 和 a 是一样的

对 a 追加一个元素,b并未发生改变

如果是赋值的话,a变,b也会变。

回到拷贝上我们再对 a 追加一个元素

当对列表a中的列表增加一个元素时,b中的列表也相应增加了。

所以浅拷贝只是对对象的顶层拷贝,并未真正断了所有联系!

深拷贝:copy.deepcopy()

例如 a = copy.deepcopy(b)

深拷贝与浅拷贝的区别就是深拷贝彻底断了所有联系!

再次使用上面的实例演示一下:

由以上操作可以看出,深拷贝是一种底层递归拷贝。

在深拷贝的操作下,a与b之间是完全断了联系的!

python中的拷贝的更多相关文章

  1. python中深浅拷贝

    python的复制,深拷贝和浅拷贝的区别   在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用 一 ...

  2. Python中深浅拷贝 垃圾回收与 super继承(六)

    1 python拷贝 深拷贝,浅拷贝 与引用三者的区别 import copy a = [1, 2, 3, 4, ['a', 'b']] #原始对象 b = a #赋值,传对象的引用 c = copy ...

  3. 谈谈Python中对象拷贝

    你想复制一个对象?因为在Python中,无论你把对象做为参数传递,做为函数返回值,都是引用传递的. 何谓引用传递,我们来看一个C++交换两个数的函数: void swap(int &a, in ...

  4. 图解Python中深浅拷贝

    在工作中,常涉及到数据的传递,在数据传递使用过程中,可能会发生数据被修改的问题.为了防止数据被修改,就需要在传递一个副本,即使副本被修改,也不会影响原数据的使用.为了生成这个副本,就产生了拷贝.今天就 ...

  5. Python中的深浅拷贝

    1.什么是深浅拷贝? python中一切皆对象,python中的数字.字符串.元组等,如果存放在了内存中,这部分内存里面的内容是不会改变的,但是也有情况,内存中存放了可变对象,比如说列表和字典,他们的 ...

  6. python中的深拷贝和潜拷贝

    >>> a = ['ace',['age',10]] >>> b = a[:] >>> c = list(a) >>> for ...

  7. Python中的变量、引用、拷贝和作用域

    在Python中,变量是没有类型的,这和以往看到的大部分编辑语言都不一样.在使用变量的时候,不需要提前声明,只需要给这个变量赋值即可.但是,当用变量的时候,必须要给这个变量赋值:如果只写一个变量,而没 ...

  8. python中的对象拷贝

    python中.进行函数參数传递或者返回值时,假设是一般的变量,会拷贝传递.假设是列表或字典则是引用传递.那python怎样对列表和字典进行拷贝传递呢:标准库的copy模块提供了两个方法:copy和d ...

  9. Python中的深浅拷贝,赋值及引用

    简单来说,若对象a中存的是列表或字典等可变对象,b对a的浅拷贝只是对对象第一层的复制,修改b第二层的元素仍然会影响两个对象. 深拷贝则是不会影响原来的对象. import copy.copy() 浅拷 ...

随机推荐

  1. C 语言实现面向对象编程

    转载 https://blog.csdn.net/onlyshi/article/details/81672279 C 语言实现面向对象编程1.引言面向对象编程(OOP)并不是一种特定的语言或者工具, ...

  2. 1.1Jmeter学习网站

    在网上找到一些关于Jmeter学习的博客等,在此标记 一. chinaunix的一篇博客,讲的蛮详细的 http://blog.chinaunix.net/uid/26884465/cid-16819 ...

  3. java获取配置文件中变量值

    在resources 目录下新建config.properties文件 #文件保存路径 filePath=E:\\images\\file 工具类 public class ConfigUtil { ...

  4. SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (utf8_general_ci,IMPLICIT) and (gb2312_chinese_ci,COERCIBLE) for operation '='

    在操作MySQL数据库时,报“ error code [1267]; Illegal mix of collations (gbk_chinese_ci,IMPLICIT) and (utf8_gen ...

  5. 2017年陕西省网络空间安全技术大赛——一维码——Writeup

    <!doctype html> 2017年陕西省网络空间安全技术大赛——一维码——Writeup 先判断下载的文件flag.png确实是png格式的图片后(binwalk, file命令均 ...

  6. 使用ltp4j碰到Can't find dependent libraries报错信息的问题解决

    项目中使用了哈工大的自然语言处理模块ltp4j,使用idea工具集成到项目中之后,在本机运行没有问题,一切正常.打成war包,部署到服务器上,使用的时候报错Can't find dependent l ...

  7. libcurl库的简介(二)

    下面是使用libcurl库实现文件上传的一个实例: void CDataProcess::sendFileToServer(void) { string netIp = strNetUrl + &qu ...

  8. scala安装此时不应有 \scala\bin\scala.bat

    scala安装目录有空格导致的,不应该有空格

  9. 解决maven项目java中配置文件打包被忽略

    pom.xml中添加以下配置 <build> <!--配置打包时不过滤非java文件开始 --> <!--说明,在进行模块化开发打jar包时,maven会将非java文件 ...

  10. Git创建合并和删除分支

    创建并切换分支 git checkout命令加上-b参数表示创建并切换分支,以下为创建并切换到dev分支: 相当于先通过 $ git branch dev 命令创建dev分支,然后 $ git che ...