python的列表复制方法

2018-09-12  本文已影响108人  木千之

2018/9/11 17:55:39

今天在写程序时,遇到了一个有趣的问题,即python中关于同时创建多个列表的的问题。自己最初的想法是初始化一个100维的嵌套列表,即

[[], []...,[],[]]

自己的原始代码是:

a = [] * 100

事后自己发现由于[]代表为空列表,因此即便采取100倍复制,依旧是空列表。

网上查了资料,如果想得到一个100维度的嵌套列表,必须事先包含一个嵌套列表:

然而,上述问题立刻出现,随便修改多维列表的一个维度,其余所有维度都会变化。再次查找资料,终于得到答案:python的深浅复制。

python语言在复制对象时提供深浅两种复制,其中浅复制仅仅复制了对象的引用,其内存地址还是同一块,因此一个改变会引起另一个改变;而只有深复制才可以重新开辟一个新的内存空间,得到完全独立的新对象。

为了得到一个独立的嵌套列表,我们使用一种新语法:

[ x for i in range(100)]

其中x表示我们要复制的对象,后面的for循环表示复制次数,而注意的是,最终结果是一个列表。

我们使用上述方法重新复制得到100维度的[]列表,并试着改变其中特定元素,查看整体的改变:

上述实验中我们使用v表示复制的嵌套列表,并使用id()函数查看了不同元素的内存地址,可以看出此种方法得到的新列表中各个子列表的内存地址是不同的,而之前的传统乘法得到的列表中则是同一个对象。

综上所述,简单小结:

1. python中对象复制存在深浅复制;

2. 一般赋值操作是浅复制,即拷贝了同一个对象的引用,指向同一个内存地址,修改会同步到所有赋值对象;

3. 嵌套列表的复制(倍数)默认也是浅复制,即嵌套列表会以引用方式复制,变化会同步;

4. 可以使用列表循环表达式实现同时创建多个独立的空列表: [[] for i in range(10)]

The Promise--Secert Garden

上一篇下一篇

猜你喜欢

热点阅读