我尝试在Python中使用with..as construct,使编写“可逆计算”代码更容易。然而,在类方法上使用@contextmanager
似乎会改变未来类实例的默认初始化。Python2.6和3.1具有相同的行为。下面是一个简单的例子来展示这种行为:
#!/usr/bin/env python
import contextlib
class SymList:
def __init__(self, L=[]):
self.L = L
@contextlib.contextmanager
def SymAdd(self, a):
self.L.append(a)
yield
self.L.append(a)
SL = SymList()
with SL.SymAdd(3):
SL.L.append(5)
print(SL.L) # Expect and see [3, 5, 3]
SL2 = SymList()
print(SL2.L) # Expect [] and see [3, 5, 3]
SL2
不是SymList
的新实例?在SL2.L
数据成员如何引用SL.L
数据成员?在
这种行为是由于mutable default arguments在Python中的工作方式造成的。在
尝试将
SymList.__init__()
更改为以下内容:在一个实例中修改
self.L
时,也在修改传递到SymList.__init__()
中的L
,因此代码的结果是,当实例首次初始化时,所有实例都将共享相同的L
属性。在相关问题 更多 >
编程相关推荐