【问题标题】:Why are the string representations of different lambdas the same? [duplicate]为什么不同 lambda 的字符串表示形式相同? [复制]
【发布时间】: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


【解决方案1】:

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

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

这很可能发生在 CPython 中,但对于基于具有延迟垃圾收集的虚拟机的 Python 实现来说则不太可能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    相关资源
    最近更新 更多