Python 垃圾收集器的行为是否与 _ 单下划线变量名有任何不同,它真的是一个 "throwaway" 变量吗?
Does Python garbage collector behave any different with a _ single underscore variable name and is it really a "throwaway" variable?
想象一个假设情况,其中一个函数 returns 有两个值:一个您不感兴趣的庞大数据集和您想要的一个小摘要。如果您的脚本(非交互式 shell)具有类似
的代码
_, the_answer = deep_thought.ask(the_ultimate_question)
,垃圾收集器会不会将 _
与任何其他名称区别开来,并且会比使用
更快地释放内存
mostly_harmless, the_answer = deep_thought.ask(the_ultimate_question)
假设 mostly_harmless
永远不会被使用。起初我认为它不会,但在阅读此后: 我开始怀疑。我希望这里有人知道答案或比我更快找到答案。
此外,对于奖励积分,它与
的性能比较如何
the_answer = deep_thought.ask(the_ultimate_question)[1]
?
注意:以下适用于 CPython(标准解释器)
要了解垃圾收集器,首先您必须了解什么是 name
,什么是 object
以及什么是对象的引用计数
取下面函数
def foo():
_ = {}
当函数被执行时,函数的本地字典和 CPython 内部持有的全局对象看起来像这样。 (这是一个过度简化的解释)
-------------------- ------------------------
| name | object_id | | id | reference_count |
-------------------- ------------------------
| _ | 1 | | 1 | 1 |
函数完成后,它的局部字典将被销毁,任何被引用的对象都会reference_count递减
------------------------
| id | reference_count |
------------------------
| 1 | 0 |
垃圾收集器最终会删除 ID 为 1
的对象,因为它不再有任何对它的引用,引用的名称(变量名称)无关紧要。
变量可以命名为任何东西,垃圾收集器只关心对象的引用计数
想象一个假设情况,其中一个函数 returns 有两个值:一个您不感兴趣的庞大数据集和您想要的一个小摘要。如果您的脚本(非交互式 shell)具有类似
的代码_, the_answer = deep_thought.ask(the_ultimate_question)
,垃圾收集器会不会将 _
与任何其他名称区别开来,并且会比使用
mostly_harmless, the_answer = deep_thought.ask(the_ultimate_question)
假设 mostly_harmless
永远不会被使用。起初我认为它不会,但在阅读此后:
此外,对于奖励积分,它与
的性能比较如何the_answer = deep_thought.ask(the_ultimate_question)[1]
?
注意:以下适用于 CPython(标准解释器)
要了解垃圾收集器,首先您必须了解什么是 name
,什么是 object
以及什么是对象的引用计数
取下面函数
def foo():
_ = {}
当函数被执行时,函数的本地字典和 CPython 内部持有的全局对象看起来像这样。 (这是一个过度简化的解释)
-------------------- ------------------------
| name | object_id | | id | reference_count |
-------------------- ------------------------
| _ | 1 | | 1 | 1 |
函数完成后,它的局部字典将被销毁,任何被引用的对象都会reference_count递减
------------------------
| id | reference_count |
------------------------
| 1 | 0 |
垃圾收集器最终会删除 ID 为 1
的对象,因为它不再有任何对它的引用,引用的名称(变量名称)无关紧要。
变量可以命名为任何东西,垃圾收集器只关心对象的引用计数