首页 > 开发 > Python > 正文

列表的复写疑问

2017-09-06 19:11:17  来源:网友分享

python编程快速上手中关于列表的知识点介绍,有段代码如下:

>>> eggs = [1, 2, 3]>>> eggs = [4, 5, 6]>>> eggs[4, 5, 6]

这里 eggs 中的列表值并没有改变,而是整个新的不同的列表值([4, 5, 6]),覆写了老的列表值

如果你确实希望修改 eggs 中原来的列表,让它包含[4, 5, 6],就要这样做:

>>> eggs = [1, 2, 3]>>> del eggs[2]>>> del eggs[1]>>> del eggs[0]>>> eggs.append(4)>>> eggs.append(5)>>> eggs.append(6)>>> eggs[4, 5, 6]

这段话我始终没有理解,感觉非常绕,请达人再通俗的讲解下,非常感谢。

解决方案

不知道C/C++里的指针和对象的概念你理解呗.

eggs = [1, 2, 3]
这句的意思是, 以"[1, 2, 3]"生成一个列表对象, 并且让eggs对它产生引用.
对应到C/C++里就是, 声明一片内存空间, 构造出一个列表对象, 让eggs这个指针指向它.

而后面
eggs = [4, 5, 6]
就是再来一个列表对象, 让eggs不要引用之前的那个了, 转而引用这个新的.
对应到C/C++里就是, 再声明一片内存空间, 构造出一个列表对象, 让eggs这个指针转而指向它.

当然, Python里是有内存回收机制的, 就是记这个声明出来的这片空间被引用的计数.
计数为零的时候就会释放掉这片空间.

回到你的问题:

这里 eggs 中的列表值并没有改变

说的是之前声明出来的那片空间做出来的列表对象, 这个列表对象的值没有改变.
因为比如这片空间还有除了eggs以外的蛋啊什么的引用了这片内存空间所对应的对象.
这片内存空间继续保持住了而没被释放.
或者说, 即使是释放了, 也不是因为蛋移情别恋了(因为还可以有别的什么爱她呀),
而是因为自己不被任何人所爱了, 选择自我了断而已.

而是整个新的不同的列表值([4, 5, 6]),覆写了老的列表值

其实就是eggs指向的空间就不再是原来那个蛋了.

第二段代码也很好的从反面解释了这个过程.