小编Rez*_*nik的帖子

删除列表时,为什么IPython与CPython对内存的管理方式不同?

我最近了解到,当您在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)

而且它总是发生的,不仅仅是获得相同参考的随机事件

更新2

我确实知道为什么发生这种情况,我只想知道为什么仅在纯python解释器上而不是在我的ipython上发生,以及哪种方法最适合内存管理

更新3

正如我可以解释的那些列表具有相同的ID的原因,我无法理解为什么它是ipython和python之间的区别。

查看List listobject.c的实现。

如我们所见,有一个称为的引用数组free_list。数组的值是被销毁的列表对象,以及numfree数组索引的计数。我们可以看到,如果删除的列表超过80个,则下一个列表将不会保存在数组中。因此,从这些代码行中我们可以说,对于任何新的python解释器,我的陈述始终是正确的。

但是我仍然找不到ipython这样工作的原因

python list ipython python-3.x python-internals

5
推荐指数
0
解决办法
186
查看次数

在pycharm中使用单独的终端运行ipdb

信息

在过去的几天里,我遇到了PyCharm令人讨厌的事情。我正在尝试使用ipdb而不是pycharm调试器来调试程序,但只能在pycharm i/o console或中打开它python console

无论如何,我可以在终端窗口中打开调试会话吗?甚至在新的终端窗口中?我不希望能够通过调试按钮打开会话,并且不要像python src/main.py在终端中那样写任何行

我想要这样做的主要原因是我可以ipython在终端机上获得自动完成功能,但是找不到在终端机窗口中打开调试会话的方法,还是可以这样做吗?和可以帮助的插件?python控制台给我的自动完成功能非常弱,无法真正帮助我

系统信息

皮查姆2018.3

Centos 7 64位

python pycharm ipdb

5
推荐指数
1
解决办法
205
查看次数

使用 fastapi UploadFile 验证文件类型和扩展名

我目前正在开发一个小项目,其中涉及创建一个fastapi允许用户上传文件的服务器jar文件的服务器。

基本上我有这条路线:

@app.post("/upload")
async def upload(jar_file: UploadFile = File(...)):
Run Code Online (Sandbox Code Playgroud)

我真的很想检查并验证该文件是否确实是jar文件。

我可以自己实现它,但我很好奇是否fastapi或任何其他包提供此功能。

python rest fastapi

2
推荐指数
1
解决办法
1万
查看次数

标签 统计

python ×3

fastapi ×1

ipdb ×1

ipython ×1

list ×1

pycharm ×1

python-3.x ×1

python-internals ×1

rest ×1