【发布时间】:2016-12-12 17:39:46
【问题描述】:
我注意到在 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 还是 python 3,这种行为都是一样的。是什么导致了这种奇怪的行为?
【问题讨论】:
-
函数对象被垃圾回收,然后内存位置被重用。这是一个实现细节。您不应该关心对象的内存位置。
-
我不知道,但我想当它没有被存储时它可能会被 gc-ed,所以你看到的是你在相同的可用空间创建它们。如果您要存储它,地址会有所不同。
标签: python memory lambda language-lawyer