Python: Unexpected behavior using contextmanager on class method
本问题已经有最佳答案,请猛点这里访问。
我试图用with..作为python中的构造,以使编写"可逆计算"代码更加容易。但是,在类方法上使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #!/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 数据成员?
这种行为是由于可变默认参数在Python中的工作方式。
尝试将
1 2 3 4 5 | def __init__(self, L=None): if L is None: self.L = [] else: self.L = L |
在一个实例中修改