为什么不同lambda的字符串表示相同?

时间:2016-12-12 17:39:46

标签: python memory lambda language-lawyer

我注意到在python中调用str(lambda: foo)会有一些奇怪的行为。如果我将lambda分配给两个不同的变量,它将转到两个不同的内存位置,即使lambda显然是相同的。例如:

>>> a = lambda: 1
>>> b = lambda: 1
>>> str(a)
'<function <lambda> at 0x0000000000AC6730>'
>>> str(b)
'<function <lambda> at 0x0000000000AC66A8>'

好的,所以当我创建并分配两个lambda时,它们会占用不同的内存位置。到现在为止还挺好。但是,如果我创建了一堆lambda并且不分配它们,那么无论lambda是多么完全不同,它们总是会到同一个地方。例如,如果我运行它:

>>> print(str(lambda: 1))
<function <lambda> at 0x00000000011B6730>
>>> print(str(lambda: "Hello"))
<function <lambda> at 0x00000000011B6730>
>>> print(str(lambda: str))
<function <lambda> at 0x00000000011B6730>
>>> print(str(lambda: (lambda: (lambda: 1))))
<function <lambda> at 0x00000000011B6730>

据我所知,无论我是否使用python 2或3,这种行为都是一样的。导致这种奇怪行为的是什么?

1 个答案:

答案 0 :(得分:1)

  

所以当我创建并分配两个lambda时,它们会占用不同的内存位置

当你调用str(lambda: 1)时,它会创建一个lambda对象,然后将其转换为字符串,最后抛弃该lambda对象。因此,当您创建另一个lambda对象时,它会占用相同的空间,因为释放的内存会被重用。

CPython可能会发生这种情况,但基于具有延迟垃圾收集的虚拟机的Python实现可能会发生这种情况。