在python中发现这个奇怪:
class SomeClass():
def __init__(self):
pass
a = [SomeClass()]
b = copy.deepcopy(a)
Run Code Online (Sandbox Code Playgroud)
输出:
>>> a
[<__main__.Some instance at 0x10051b1b8>]
>>> b
[<__main__.Some instance at 0x10051b092>]
Run Code Online (Sandbox Code Playgroud)
这与预期一样 - deepcopy SomeClass()
为b 创建了新对象.
但是,如果,
f = lambda x:x+1
a = [f]
b = copy.deepcopy(a)
Run Code Online (Sandbox Code Playgroud)
我明白了:
>>> a
[<function <lambda> at 0x10056e410>]
>>> b
[<function <lambda> at 0x10056e410>]
Run Code Online (Sandbox Code Playgroud)
为什么deepcopy在第二种情况下不会创建新的lambda实例?这是否意味着lambda函数是原子的?
这不仅适用于lambdas,而且适用于没有更普遍状态的函数.
>>> def some_function(word): print word
>>> a = [some_function]
>>> a
[<function some_function at 0x1007026e0>]
>>> copy.deepcopy(a)
[<function some_function at 0x1007026e0>]
Run Code Online (Sandbox Code Playgroud)
由于函数不存储状态,因此deepcopy不会为它们创建新的引用.这里记录了与此问题类似的主题(虽然不完全相同的问题)的有趣讨论:http://bugs.python.org/issue1515
作为某些人认为lambda不可变的旁注,请观察以下行为:
>>> a = lambda x: x + 1
>>> a(12)
13
>>> b = lambda x: x - 1
>>> b(12)
11
>>> a.__code__ = b.__code__
>>> a(12)
11
>>>
Run Code Online (Sandbox Code Playgroud)
d[types.BuiltinFunctionType] = _deepcopy_atomic
d[types.FunctionType] = _deepcopy_atomic
Run Code Online (Sandbox Code Playgroud)
模块认为它们是原子的,我不知道如何改变lambda.
归档时间: |
|
查看次数: |
1069 次 |
最近记录: |