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  -  -

最新文章

  1. Android Weekly Notes Issue #235
  2. CSS基本语法
  3. 【洛谷P1541】乌龟棋
  4. iOS开发-状态模式
  5. Yii系列教程(三):集成Redis
  6. linux sar 命令详解
  7. 网络协议——IP
  8. nginx(ubuntu)设置别名访问目录
  9. 【Python】 压缩文件处理 zipfile &amp; tarfile
  10. virsh命令来创建虚拟机
  11. nodejs fs path
  12. luogu 1291 概率期望递推
  13. React Native基础&amp;入门教程:以一个To Do List小例子,看props和state
  14. sopUI上手教程
  15. extjs使用笔记-21
  16. html可用于跨域的三个标签
  17. 《Nginx - location配置》
  18. 以代码爱好者角度来看AMD与CMD(转)
  19. node的 node-sass@^4.11.0 出现:npm: no such file or directory, scandir &#39;.../node_modules/node-sass/vendor&#39;
  20. sql 递归查询所有的下级

热门文章

  1. mysql-sql命令
  2. Python列表类型及常用操作
  3. better-scroll 遇到的问题 3 (transition-group 相关)
  4. Android开发之——依赖冲突Program type already present
  5. wechat开发笔记之1.线上环境搭建与测试
  6. 一、Dapper基本操作
  7. python模块详解 time与date time
  8. 关于如何等待一个元素的出现而不用一些笨拙粗暴的time.sleep()方法
  9. Cordova各个插件使用介绍系列(七)—$cordovaStatusbar手机状态栏显示
  10. 运行在 Android 系统上的完整 Linux -- Termux