再踩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的浅复制。 更加深层次说,它复制了对象,但对于对象中的元素,依然使用引用。 既然浅拷贝用的是...

difference between Python shallow copy and deep copy

A: Shallow copies duplicate as little as possible. A shallow copy of a collection is a copy of the ...

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

这个又叫浅复制和深复制。 其相同点和区别: 相同点: 浅复制和深复制都是通过复制创建了一个新的对象,也就是 x.clone() != x 浅复制和深复制的对象所属的类是一致的,也就是 x.cl...

《数据结构和Java集合框架第三版》读书笔记(五)浅复制(shallow copy)和深复制

今天学习ArrayList 它的复制构造函数和clone()函数均为浅复制(shallow copy),即复制对象的引用。相反的深复制,则是复制对象的本身。 复制构造函数 ArrayList (Col...

NET深入学习笔记(4):深拷贝与浅拷贝(Deep Copy and Shallow Copy)

全文还是分四部分:1.基本概念  2.深拷贝与浅拷贝实现机制 3.代码实现和分析 4.总结。下面我们来进入正式的学习。    1.基本概念:        首先我们应该了解一下什...

深拷贝与浅拷贝(Deep Copy and Shallow Copy)

深拷贝与浅拷贝(Deep Copy and Shallow Copy) 作者:Frank Xu Lei出处:博客2011-08-01 14:54   我今天就在总结一下,并且添加了详细的代码...

assignment,shallow copy,deep copy,引用,不可变对象

要了解assignment,shallow copy,deep copy这3个概念,就必须明白Python的所有变量都只是引用。 引用 比如 i =1; ii=i; iii=ii; >>> for...

Java Clone, Shallow Copy and Deep Copy

In java, though clone is ‘intended’ to produce a copy of the same object it is not guaranteed. Clone...

.NET深入学习笔记(4):深拷贝与浅拷贝(Deep Copy and Shallow Copy)

今天继续利用准备WSE安全开发文章的空闲时间,完善《.NET深入学习笔记》系列(基本都是.Net重要的知识点,我都做了详细的总结,是什么、为什么、和怎么实现)。想必很多人也接触过这两个概念。做过C++...

iPhone开发之Deep Copy和Shallow Copy的区别

首先,从copy开始说,简而言之,copy的目的就是生成一个新的实例,然后把其成员都按原实例赋值。对于非指针型的成员,比如BOOL, int, float,这样的赋值可以直接进行。但是对于指针型的数据...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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