为什么deepcopy不创建对lambda函数的新引用?

2024-03-28 12:51:49 发布

您现在位置:Python中文网/ 问答频道 /正文

在python中发现了这一点:

class SomeClass():
    def __init__(self):
        pass

a = [SomeClass()]
b = copy.deepcopy(a)

输出:

^{pr2}$

这和预期的一样-deepcopy为b创建了新的SomeClass()对象

但如果

f = lambda x:x+1
a = [f]
b = copy.deepcopy(a)

我得到:

>>> a
[<function <lambda> at 0x10056e410>]
>>> b
[<function <lambda> at 0x10056e410>]

为什么deepcopy在第二种情况下不创建新的lambda实例?这是否意味着lambda函数是原子的?在


Tags: 对象实例lambdaselfinitdef情况function
3条回答

这不仅适用于lambdas,而且更普遍地适用于没有状态的函数。在

>>> def some_function(word): print word
>>> a = [some_function]
>>> a
[<function some_function at 0x1007026e0>]
>>> copy.deepcopy(a)
[<function some_function at 0x1007026e0>]

因为函数不存储状态,所以deepcopy不会为它们创建新的引用。这里记录了一个与此问题类似的有趣的话题讨论(尽管不是完全相同的问题):http://bugs.python.org/issue1515

查看222 and 223 from the source code行:

d[types.BuiltinFunctionType] = _deepcopy_atomic
d[types.FunctionType] = _deepcopy_atomic

模块认为它们是原子的,我不知道如何使lambda突变。在

对于一些认为lambdas不可变的人来说,请注意以下行为:

>>> a = lambda x: x + 1
>>> a(12)
13
>>> b = lambda x: x - 1
>>> b(12)
11
>>> a.__code__ = b.__code__
>>> a(12)
11
>>> 

相关问题 更多 >