鱼C论坛

 找回密码
 立即注册
查看: 1286|回复: 4

[技术交流] pycharm中的一个坑,

[复制链接]
发表于 2020-3-9 10:35:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 像风 于 2020-3-9 11:31 编辑

其实也不能说是坑,但是很容易让我这种小白陷入误区。事情是这样的:
我以前看的一直是小甲鱼的《零基础入门学习python》,对小甲鱼的编程技术自然是佩服不已(其实老听他讲段子去了,知识点都给我听漏了)
所以我也就一直用的IDLE,把小甲鱼的视频中的基础部分刷了两遍。然后我就换了一个教程视频(录制时间是2019年),才知道原来还有pycharm这么好用的东西。
然后我就转移阵营了,改用pycharm了。
但是今天我在跟着别的视频教程用pycharm做测试的时候,发现了一个跟小甲鱼视频讲的相互冲突的知识点:类和对象中的del魔法方法
我以前看小甲鱼视频用world做的笔记.jpg
(最开始是没有那个删除线和后的括号,我今天刚加的)那时我还不是很明白,所以笔记记得不是很清楚。
小甲鱼讲的应该是,只有当删除了所有由这个类所实例化的对象的引用时,才会调用del魔法方法,我也对此深信不疑。
但是我新看这个教程里面的老师在边讲边做测试的时候,出现了一个问题,就是只删除一个引用,还有其它引用的存在,居然也调用del魔法方法了?
然后删两个引用(没有删完),也调用了del魔法方法,但是只调用了一次。
我有点懵,我能感觉到老师也有点乱了手脚,思路都不清晰了,但是老师果然是高手,很快就调整了过来,避开了这个知识点没有讲。
然后我就把视频暂停,自己来测试,果然也是这样:
在pycharm中.jpg
我明明就只删除了 p1,还存在其他对这个对象的引用,但是却打印出了del魔法方法里面的内容??
然后我就对自己说,肯定是版本的改变,毕竟小甲鱼那个视频是13年的。现在版本肯定是,删除一个引用就调用一次del魔法方法
然后我就尝试删两个引用
删除两个引用.jpg
但是也只调用一次del魔法方法啊,怎么回事?我是唯物主义者,看到的现象,我就开始总结规律。对于这个del魔法方法,新版本是怎么改动的呢?
我总结出来是这样的,只要有删除对象的引用的操作,就会调用del魔法方法,但是只会在最后一次删除的时候调用。
我觉得很邪门,然后我去IDLE中测试,卧槽,一测我更懵了。跟我结论不一样啊
在IDLE中.jpg
删除一个引用的时候根本就没有调用del魔法方法啊,
删除两个引用的时候:
在idle中删除两个引用.jpg
还是没有调用del魔法方法
只有删除所有引用时,才会调用del魔法方法:
当删除所有引用时.jpg
那这样说,小甲鱼讲得也没错啊,为什么pycharm中会出现不一样的结果呢?
最后我猜测,在pycharm中,一旦执行完所有代码,pycharm就会自动删除所有东西,包括对象的引用。所以即便在代码中只删除了一个对对象的引用,也会在执行代码的时候‘帮’我们删除所有,然后我们就能在控制台上看到,del魔法方法被调用了
但是IDLE不一样,因为在执行完shell中的代码之后,会进入到一个交互模式,在交互模式下还能继续用shell里面的东西:
可以继续进行交互式.jpg
直到删除了所有引用,才会调用del魔法方法。

所以,最后的结论是,只有删除了对这个对象的所有引用,才会调用类里面的del魔法方法。注意,是删除所有对这个对象的引用,即便还有别的通过这个类实例化的对象,也还是会调用del魔法方法的,我测试过。
不知道那个老师在后面的视频里面有没有重新讲这个问题,不过老师的应变能力是真的强。

补充:其实,如果在pycharm中仔细观察、对比,也能发现一些端倪
不删除所有引用.jpg
删除所有引用.jpg
仔细观察会发现,如果不删除删除所有引用,del魔法方法被调用是在最后的,也就是在“此时已经删除p3”之后。而如果删除了所有引用,del魔法方法调用并不是在最后,而是在“此时已经删除p”之前的。
这也就从侧面佐证了,如果我们在代码中并没有完全删除对象的所有引用,pycharm会在最后自动删除,所以会在最后被调用。而如果我们在代码中删除了所有引用,代码在执行到最后一个引用被删除时,会马上就调用del魔法方法。然后再执行后面的代码,也就是先打印“这里是del魔法方法”,然后再打印“此时已经删除p”。因为在执行到del p的时候,就会去类里面找del魔法方法了




老师的理解还是深刻的,老师在视频的最后把这个解释为:python解释器会在执行完代码后回收这段代码中开辟的所有空间,也就是占的系统内存。我猜测的也差不多,只不过IDLE是一个特殊的解释器,


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-9 10:41:45 | 显示全部楼层
换头像捞?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-9 10:43:23 | 显示全部楼层
本帖最后由 乘号 于 2020-3-9 13:05 编辑

能找出pycharm的坑你也挺牛了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-9 10:48:47 | 显示全部楼层
乘号 发表于 2020-3-9 10:43
能找出python的坑你也挺牛了

我说的是pycharm,不是python
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-9 10:52:14 | 显示全部楼层

之前那个系统给的头像,没改都是那个,不能给人留下深刻的印象,搞不好让人以为是机器人,换了一个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 21:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表