Python:在类方法上使用contextmanager的意外行为

2024-09-28 03:23:05 发布

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

我尝试在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数据成员?在

Tags: and实例selfdefwithexpectprintsee
1条回答
网友
1楼 · 发布于 2024-09-28 03:23:05

这种行为是由于mutable default arguments在Python中的工作方式造成的。在

尝试将SymList.__init__()更改为以下内容:

    def __init__(self, L=None):
        if L is None:
             self.L = []
        else:
             self.L = L

在一个实例中修改self.L时,也在修改传递到SymList.__init__()中的L,因此代码的结果是,当实例首次初始化时,所有实例都将共享相同的L属性。在

相关问题 更多 >

    热门问题