再踩Python的Shallow Copy

原创 2017年01月25日 12:02:15

最近人工智能很火,Python也不可避免地跟着再火一把。
有天在微博上刚好看到这么一段话:

@寒冬winter:我来谈两个新标准:写出一个动态规划(最大子段和)再谈算法,写出模拟退火、遗传和神经网三大算法之一的小demo再谈AI。这不过分吧?

由于我自己也是比较注重基础的,所以挺赞同这句话的。虽然现在算法工程师经常自嘲为“调参工程师”,但那也是人家自嘲,好比写工程代码的研发工程师,也可以自嘲为“搬砖工程师”。但说实话,真把这种话当真的,估计砖没搬好还反倒添乱。

于是我就在想,不如重拾生疏已久的Python手艺,先来刷刷DP题练练手,再去深入看看人工智能领域。

回头看了下我之前写的Python博文,已经是很多年以前了,当时从2.7切换到3还是遇到了些问题,没想到这么多年过去了,Python2.7的份额还是那么大,不由得我感慨了下

不过这么多年过去了,除了隐约的PVM记忆和记录下来的博文,Python 2.7和Python 3对我来说都一样,想想还是从Python 3.5写起吧。

回到题目来。
在刷题过程中要用Python来构造二维数组,虽然我脑子里第一飘过的是不等长的数组,如:

[
[1]
[2, 3]
[4, 5, 6]
]

毕竟Python和Objective-C一样,万物皆对象,[]中放的都是PyObject,无所谓长短。

但是后续由于写C语言的惯性,我写起代码来还是预先初始化了N*N的数组来:routes = [[0] * n] * n,相比于长度不一致的数组元素来说,比较可以避免越界操作。

结果在做写操作的时候遇到了问题:

routes = [[0] * n] * n
routes[0][0] = 1
print(routes)
输出了:[[1, 0, 0], [1, 0, 0], [1, 0, 0]]

第一反应还是有点懵的,因为按照C语言的逻辑,每一个元素都位于不同的地址才对,怎么一行赋值语句写了三个不同地址?

直到后来看到Shallow Copy这两个单词,我脑子里面瞬间回忆起多年以前刚写Python的时候,也踩过这个坑。

想来这是Python这种解释型脚本语言在因为引入了类似PVM这种虚拟机带来的性能变慢(相较于C语言之类的),而尽力去追求的优化。

如果要预先初始化出Deep Copy的二维数组,可以这么写:routes = [([-1] * n) for i in range(n)],不过参考Python这种优化态度,可能在需要时再append不等长的数组元素会比较好?也就是说,会比较pythonic

python 浅拷贝(shallow copy) 深拷贝(deep copy)

浅拷贝(shallow copy) copy(x) 创建新的复合对象并通过引用复制x的成员来创建x的浅复制。 更加深层次说,它复制了对象,但对于对象中的元素,依然使用引用。 既然浅拷贝用的是...
  • muzilanlan
  • muzilanlan
  • 2016年01月08日 17:57
  • 1680

Python中赋值、浅拷贝与深拷贝

python中关于对象复制有三种类型的使用方式,fuzhi
  • szchtx
  • szchtx
  • 2014年04月04日 21:48
  • 12968

再踩Python的Shallow Copy

最近人工智能很火,Python也不可避免地跟着再火一把。 有天在微博上刚好看到这么一段话:@寒冬winter:我来谈两个新标准:写出一个动态规划(最大子段和)再谈算法,写出模拟退火、遗传和神经网三大...
  • jasonblog
  • jasonblog
  • 2017年01月25日 12:02
  • 1348

[Python]理解Python深拷贝DeepCopy与浅拷贝ShallowCopy

先从简单的类型入手,举例说明:>>> import copy >>> inta = 10 >>> intb = copy.copy(inta) >>> id(inta),id(intb) (84312...
  • ysgjiangsu
  • ysgjiangsu
  • 2017年07月19日 15:18
  • 231

Deep copy(深拷贝)和shallow copy(浅拷贝)的区别

deep copy 和shallow copy 都是用于对象之间的拷贝,简单来说,如果
  • Andrewseu
  • Andrewseu
  • 2014年05月24日 18:03
  • 2519

shallow copy与deep copy

Java数据类型分为两大类: 基本数据类型与引用数据类型: 基本数据类型: 变量名指向具体的数值 逻辑类型:boolean (默认值:true); 文本类型:char (默认值:'\0',即\u00...
  • u014753393
  • u014753393
  • 2016年04月25日 23:45
  • 260

Python之赋值与深浅拷贝

赋值   在Python中,赋值语句是建立对象的引用,而不是复制对象,变量就像一个指针.例如: # coding:utf-8 list_a = [1, 2, 3, ['a', 'b', 'c']] ...
  • shuaijiasanshao
  • shuaijiasanshao
  • 2016年05月15日 08:50
  • 2452

Python Cookbook英文版

  • 2013年06月28日 10:23
  • 1.55MB
  • 下载

浅拷贝(shallow copy)和深拷贝(deep copy)

记得面试的时候面试官问我浅复制和深复制有什么区别。只用过python里可变数据类型的copy函数的我一脸懵逼,xjb说了一点,结果自然惨不忍睹。。我回来一查,原来他说的是copy库。。敲里吗啊,cop...
  • keyboardwarrior
  • keyboardwarrior
  • 2018年01月11日 13:41
  • 61

漫谈deepcopy(深拷贝)和shallowcopy(浅拷贝)

浅拷贝:只复制当前的对象,对该对象内部的引用(其他类对象作为自己的元素-也叫对其他对象的引用)不能复制(在堆内存中从新创建空间,内容相同,但地址不同)。 深拷贝:对对象内部的引用均复制,是创建一个新的...
  • u010111016
  • u010111016
  • 2016年06月15日 20:23
  • 2979
收藏助手
不良信息举报
您举报文章:再踩Python的Shallow Copy
举报原因:
原因补充:

(最多只允许输入30个字)