python - 列表的复写疑问

查看:94
本文介绍了python - 列表的复写疑问的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

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指向的空间就不再是原来那个蛋了.

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

这篇关于python - 列表的复写疑问的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆