我最近了解到,当您在Python中删除列表时,该列表的引用会保存在数组中,并在初始化新列表时弹出。
我在常规解释器中运行了此命令:
l = [1,2,3]
l_id = id(l)
del l
g = [1,2,3]
id(g) == l_id # True
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,我得到了正确的结果。
我在IPython解释器上尝试了相同的操作,但是得到了False。为什么会发生?是不是更好?
python版本:v3.7.0:1bf9cc5093
IPython版本:7.5.0
它也发生在不同的列表中:
l = [1,2,3]
l_id = id(l)
del l
g = [1,2,3,4,5,6,7,8]
id(g) == l_id # True
Run Code Online (Sandbox Code Playgroud)
而且它总是发生的,不仅仅是获得相同参考的随机事件
我确实知道为什么发生这种情况,我只想知道为什么仅在纯python解释器上而不是在我的ipython上发生,以及哪种方法最适合内存管理
正如我可以解释的那些列表具有相同的ID的原因,我无法理解为什么它是ipython和python之间的区别。
查看List listobject.c的实现。
如我们所见,有一个称为的引用数组free_list。数组的值是被销毁的列表对象,以及numfree数组索引的计数。我们可以看到,如果删除的列表超过80个,则下一个列表将不会保存在数组中。因此,从这些代码行中我们可以说,对于任何新的python解释器,我的陈述始终是正确的。
但是我仍然找不到ipython这样工作的原因
在过去的几天里,我遇到了PyCharm令人讨厌的事情。我正在尝试使用ipdb而不是pycharm调试器来调试程序,但只能在pycharm i/o console或中打开它python console。
无论如何,我可以在终端窗口中打开调试会话吗?甚至在新的终端窗口中?我不希望能够通过调试按钮打开会话,并且不要像python src/main.py在终端中那样写任何行
我想要这样做的主要原因是我可以ipython在终端机上获得自动完成功能,但是找不到在终端机窗口中打开调试会话的方法,还是可以这样做吗?和可以帮助的插件?python控制台给我的自动完成功能非常弱,无法真正帮助我
皮查姆2018.3
Centos 7 64位
我目前正在开发一个小项目,其中涉及创建一个fastapi允许用户上传文件的服务器jar文件的服务器。
基本上我有这条路线:
@app.post("/upload")
async def upload(jar_file: UploadFile = File(...)):
Run Code Online (Sandbox Code Playgroud)
我真的很想检查并验证该文件是否确实是jar文件。
我可以自己实现它,但我很好奇是否fastapi或任何其他包提供此功能。