如果我们有这样的表达式:
2 + 2
或者任何其他我们没有在任何地方分配的值,那么 PyCharm 会告诉你
该声明似乎没有效果
但解释器不会抱怨,代码将被执行。
问题是:计算结果将会去往何处?它会被存放在某个地方,然后被垃圾工人运走,还是根本不会被存放在任何地方?
如果我们有这样的表达式:
2 + 2
或者任何其他我们没有在任何地方分配的值,那么 PyCharm 会告诉你
该声明似乎没有效果
但解释器不会抱怨,代码将被执行。
问题是:计算结果将会去往何处?它会被存放在某个地方,然后被垃圾工人运走,还是根本不会被存放在任何地方?
有时它存储在堆栈顶部,有时它根本不存在,有时它永远存在。
反汇编程序dis将为您提供以下代码
即使你不明白发生了什么,你也可以看到说明中没有任何添加的内容。编译器足够智能,能够理解该表达式
2 + 2没有副作用,其结果不引起我们的兴趣,因此可以删除该表达式。然后他删除了它。让我们强制编译器计算总和。
在此代码中,加法为:
LOAD_FAST,,LOAD_FAST。编译器保留加法,因为它不知道和的BINARY_OP类型。它们可能由用户以这样一种方式定义,即添加会产生副作用。abPython 解释器使用堆栈来存储值。加法过程将其结果留在堆栈的顶部。事实上,这就是你的问题的答案。
下一条指令是
POP_TOP。它从堆栈顶部删除值。该值变得不可用。随着时间的推移,所有不可用的值都会被垃圾收集器收集。这里需要说明一下:Python 中的所有对象都存储在可用内存中,当我说“该值位于堆栈顶部”时,它的意思是堆栈顶部是一个指向可用内存中对象的指针。如果从堆栈中删除一个指针,并且它是指向某个对象的最后一个指针,则该对象将成为垃圾收集的合法目标。
但
2 + 2垃圾收集器不会收集结果。从-5到256的整数值存储在缓存中,以加快操作并节省内存。因此,即使在指令之后,POP_TOP值4(如果结果恰好是4)仍可从缓存中获取,并且垃圾收集器不会将其删除。