copy : 相当于只是拷贝表面一层,如果里面还有深层次的引用,那么也是直接拷贝引用的地址,而且如果拷贝对象是不可变类型比如元组,那么也是直接拷贝引用.

deepcopy: 无论是拷贝可变类型还是不可变类型,无论是里面嵌套了多深层次的引用关系,统统复制一份,在新的空间中存储起来.

之前在廖雪峰老师的网站上看到一个练习题,输出杨辉三角,一位同学这么写的:

import copy
def triangles():
L = []
while True:
yield L
#L = L.copy()
L.append()
L = [L[i-]+L[i] for i in range(len(L))]

思路没问题,但是,他这样问:copy那步,无论是否注释,输出一样,可是一注释就会测试失败,可输出没问题,怎么回事?

因为之前了解过引用,浅拷贝,深拷贝,所以肯定是防止append内存地址和别的东西冲突,但是我测试了一看,输出没问题啊,那是怎么肥四?

廖雪峰老师为了方便同学调试代码,在网站上直接做了个输入代码的地方,只要在本机用脚本开端口,就可以直接在网站上调试代码,输出结果,他的测试结果对错的代码是这样的:

# 期待输出:
# []
# [, ]
# [, , ]
# [, , , ]
# [, , , , ]
# [, , , , , ]
# [, , , , , , ]
# [, , , , , , , ]
# [, , , , , , , , ]
# [, , , , , , , , , ]
n =
results = []
for t in triangles():
print(t)
results.append(t) <-----------------------------------------------------------------------------------------------------------
n = n +
if n == :
break
if results == [
[],
[, ],
[, , ],
[, , , ],
[, , , , ],
[, , , , , ],
[, , , , , , ],
[, , , , , , , ],
[, , , , , , , , ],
[, , , , , , , , , ]
]:
print('测试通过!')
else:
print('测试失败!')

append ....对,你没有看错,从生成器中取出一个值t,直接append加到results里面去了,导致如果生成器里面对列表L和t一样内存地址的元素进行操作,则直接影响到results里面的结果.

如果不加L=L.copy()这一句的的话,生成器里面L.append(0),则results里面对应的元素也加个0  -  -

Python__学习路上的坑之--引用,浅拷贝,深拷贝的更多相关文章

  1. 掌握AI学习路上核心理论知识,你绝对不能错过这份最全资料包

    人工智能成为当下科技发展的代表之一,持续受到了不少追捧,不管你是否是这一专业的学生或者职场人,学习并掌握一项新潮技能总是不会被同龄人淘汰的.我曾经问过别人.也被别人问过关于学习人工智能(AI)最好的方 ...

  2. 【转】基于 Android NDK 的学习之旅-----数据传输(引用数据类型)

    原文网址:http://www.cnblogs.com/luxiaofeng54/archive/2011/08/20/2147086.html 基于 Android NDK 的学习之旅-----数据 ...

  3. Swift 学习笔记 (三) 之循环引用浅析

    原创:转载请注明出处 110.自动引用计数实践 下面的例子展示了自动引用计数的工作机制.例子以一个简单的Person类开始,并定义了一个叫name的常量属性: class Person {     l ...

  4. 双刃剑MongoDB的学习和避坑

    双刃剑MongoDB的学习和避坑 MongoDB 是一把双刃剑,它对数据结构的要求并不高.数据通过key-value的形式存储,而value的值可以是字符串,也可以是文档.所以我们在使用的过程中非常方 ...

  5. JS中有关对象的继承以及实例化、浅拷贝深拷贝的奥秘

    一.属性的归属问题 JS对象中定义的属性和方法如果不是挂在原型链上的方法和属性(直接通过如类似x的方式进行定义)都只是在该对象上,对原型链上的没有影响.对于所有实例共用的方法可直接定义在原型链上这样实 ...

  6. $.extend()浅拷贝深拷贝

    参考网址:http://bijian1013.iteye.com/blog/2255037 jQuery.extend() 函数用于将一个或多个对象的内容合并到目标对象. 注意:1. 如果只为$.ex ...

  7. vue学习【一】vue引用封装echarts并展示多个echarts图表

    大家好,我是一叶,经过一段时间对vue的学习,我打算把vue做一个系列,把踩过的坑和大家分享一下. 现在开始第一章:vue引用并封装echarts 在文章开始前,我先舔波echarts(真香).阿里的 ...

  8. Android学习笔记之SoftReference软引用...

    PS:其实这一篇和上一篇很类似,都是为了解决内存不足(OOM)这种情况的发生... 学习内容: 1.对象的引用类....   最近也是通过项目中知道了一些东西,涉及到了对象的引用类,对象的引用类分为多 ...

  9. 我的Python学习笔记(二):浅拷贝和深拷贝

    在Python中,对象赋值,拷贝(浅拷贝和深拷贝)之间是有差异的,我们通过下列代码来介绍其区别 一.对象赋值 对象赋值不会复制对象,它只会复制一个对象引用,不会开辟新的内存空间 如下例所示,将test ...

随机推荐

  1. WebView加载页面,带链接的Img在页面第一次加载时无法显示的问题

    在做一个App的过程中,用到WebView来显示几个页面.在这个过程中发现有些页面的显示出现了异常:页面中的Img链接在页面第一次加载时无法正常显示图片,退出页面再次进入后可正常显示.开始以为是Web ...

  2. three.js一个简单demo学些和讲解

    叉口裁剪球体案例 二话不说先上效果图: 全部代码带注释 <!DOCTYPE html> <html lang="en"> <head> < ...

  3. Android 6.0 动态权限申请

    1. 概述 Android 6.0 (API 23) 之前应用的权限在安装时全部授予,运行时应用不再需要询问用户.在 Android 6.0 或更高版本对权限进行了分类,对某些涉及到用户隐私的权限可在 ...

  4. Struts2_Action和Result总结

    Action 1.实现一个Actiond的最常用方式:从ActionSupport继承2.DMI动态方法调用3.通配符配置 *{1}{2}... a) *_*4.接收参数的方法(一般用属性或者Doma ...

  5. [topcoder]TheGridDivTwo

    http://community.topcoder.com/stat?c=problem_statement&pm=13628&rd=16278 标程是BFS,我用DFS,都可解. 这 ...

  6. 搭建Web开发环境JavaEE_Eclipse

    1. 下载和安装1.1 下载JDK在Java官方网站下载最新版本的 Java SE:  http://www.oracle.com/technetwork/java/javase/downloads/ ...

  7. 关于Java虚拟机内存原型的基本知识

    Java虚拟机内存原型的六个部分: 1.寄存器:我们在程序中无法控制 2.栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中 3.堆:存放用new产生的数据 4.静态域:存放在 ...

  8. C4C销售订单行项目价格维护方法

    需求很简单,能够创建销售订单,在行项目里添加产品,带出价格来,同时把总价显示在销售订单抬头区域. 如下图所示: 下面是具体配置. Business Configuration里,点击Sales Ord ...

  9. 【转载】#335 - Accessing a Derived Class Using a Base Class Variable

    You can use a variable whose type is a base class to reference instances of a derived class. However ...

  10. 【JavaScript 封装库】BETA 1.0 测试版发布!

    /* 源码作者: 石不易(Louis Shi) 联系方式: http://www.shibuyi.net =============================================== ...