lambda函数的内存地址

vrd*_*rde 3 python lambda closures

我在Python 2和3中注意到了这种行为:

>>> id(lambda: 1) == id(lambda: 2)
True
Run Code Online (Sandbox Code Playgroud)

它们也共享相同的哈希值.

>>> hash(lambda: 1) == hash(lambda: 2)
True
Run Code Online (Sandbox Code Playgroud)

我期望两个lambda函数有两个不同的 id s和hashes.

我调查了更多,并在返回闭包时发现了类似的行为:

>>> def foo(n):
...     def bar():
...         return n
...     return bar
... 
>>> id(foo(1)) == id(foo(2))
True
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我认为它id是相同的,因为返回的函数完全相同,而正在改变的只是封闭范围.

有什么类似的lambda功能发生?

Dan*_*man 5

这与范围,lambdas或闭包无关.简单地说,Python通过引用计数管理内存,并且这些lambda从不分配给任何引用,因此Python会立即删除它们并重用下一个对象的内存位置.