再踩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中赋值、浅拷贝与深拷贝

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

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 ...
  • xluren
  • xluren
  • 2015年05月01日 13:07
  • 525

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

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

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

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

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

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

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

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

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

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

Shallow Copy与Deep Copy

先做个关于Core Foundation对象复制简单的介绍:   一般来讲,标准的复制,指的是简单的赋值操作的调用,也就是使用 = 操作符来赋值一个变量给另一个变量,比如说: 1 int a ...

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...
  • gmemai
  • gmemai
  • 2015年09月25日 14:46
  • 175
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:再踩Python的Shallow Copy
举报原因:
原因补充:

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