2018/9/11 17:55:39
今天在写程序时,遇到了一个有趣的问题,即python中关于同时创建多个列表的的问题。自己最初的想法是初始化一个100维的嵌套列表,即
[[], []...,[],[]]
自己的原始代码是:
a = [] * 100
事后自己发现由于[]代表为空列表,因此即便采取100倍复制,依旧是空列表。
![](https://img.haomeiwen.com/i7972770/f20cb4bdd1a71a3b.png)
网上查了资料,如果想得到一个100维度的嵌套列表,必须事先包含一个嵌套列表:
![](https://img.haomeiwen.com/i7972770/268fa02eb240f2e5.png)
然而,上述问题立刻出现,随便修改多维列表的一个维度,其余所有维度都会变化。再次查找资料,终于得到答案:python的深浅复制。
python语言在复制对象时提供深浅两种复制,其中浅复制仅仅复制了对象的引用,其内存地址还是同一块,因此一个改变会引起另一个改变;而只有深复制才可以重新开辟一个新的内存空间,得到完全独立的新对象。
为了得到一个独立的嵌套列表,我们使用一种新语法:
[ x for i in range(100)]
其中x表示我们要复制的对象,后面的for循环表示复制次数,而注意的是,最终结果是一个列表。
我们使用上述方法重新复制得到100维度的[]列表,并试着改变其中特定元素,查看整体的改变:
![](https://img.haomeiwen.com/i7972770/12a6f39800f2f2bb.png)
上述实验中我们使用v表示复制的嵌套列表,并使用id()函数查看了不同元素的内存地址,可以看出此种方法得到的新列表中各个子列表的内存地址是不同的,而之前的传统乘法得到的列表中则是同一个对象。
综上所述,简单小结:
1. python中对象复制存在深浅复制;
2. 一般赋值操作是浅复制,即拷贝了同一个对象的引用,指向同一个内存地址,修改会同步到所有赋值对象;
3. 嵌套列表的复制(倍数)默认也是浅复制,即嵌套列表会以引用方式复制,变化会同步;
4. 可以使用列表循环表达式实现同时创建多个独立的空列表: [[] for i in range(10)]
网友评论