【问题标题】:Clearing a Python Class embedded list (actual issue: return closes function)清除 Python 类嵌入列表(实际问题:return closes 函数)
【发布时间】:2017-09-26 22:30:07
【问题描述】:

如何使用函数清除类嵌入列表?这是重现该行为的代码。

class LogClass(object):
    def __init__(self):
        self.logList=[]
    def __call__(self,msg='',Data={},Level=1,Exc=False):
        self.logList.append((msg,Data,Level,Exc))
    def read(self):
        return self.logList
        self.logList[:]=[]

函数 read 应该在被调用后清除列表。但是,self.logList 内容仍然存在。我认为这与复制上面返回行中的内容有关,但我不确定如何解决这个问题。

使用代码:

class LogClass(object):
    def __init__(self):
        self.logList=[]
    def __call__(self,msg='',Data=None,Level=1,Exc=False,Verbose=''):
        if not Data:
            Data={}
        self.logList.append((msg,Data,Level,Exc,TimeStamp(),Verbose))
    def read(self):
        L=self.logList
        self.logList=[]
        return L

虽然我认为我已经解决了 Data={} 可变默认参数,但我无法重新创建您发布的链接中的虚假效果。例如,在 call 参数中保留 Data={} 并运行以下命令:

In [109]: Log("1st call",Data={"call":1}) 

In [110]: Log("2nd call")

In [111]: Log("3rd call",Data={"call":3})

In [112]: Log.read()
Out[112]: 
[('1st call', {'call': 1}, 1, False, 1506568154.223882, ''),
 ('2nd call', {}, 1, False, 1506568167.787137, ''),
 ('3rd call', {'call': 3}, 1, False, 1506568176.463921, '')]

不过我应该更加警惕,因为我已经成为猎物before

【问题讨论】:

  • @PRMoureu 好吧,我们可能想先返回self.logList 的当前值,所以他需要将它保存在一个临时变量中。
  • 另外,请注意mutable default argument
  • 参见上面关于可变默认参数的编辑

标签: python list class


【解决方案1】:

return 结束方法的执行,所以它下面的任何东西都不会运行。你想要这样的东西:

def read(self):
    old_list = self.logList
    self.logList = []
    return old_list

【讨论】:

    【解决方案2】:

    return 结束执行,self.logList[:]=[] 无法访问。如果您想要返回值 self.logList 并清除此变量,您可以使用该代码:

    def read(self):
        old_log_list = self.logList.copy()  # copy of field for return old value
        self.logList[:]=[]
        return old_log_list
    

    编辑:

    @Peter DeGlopper 版本更好。我建议了@scientificCompNoob 代码,并且我不必要地创建了该字段的副本,但是当您使用self.logList [:] = [] 而不是self.logList = [] 时这是必要的

    【讨论】:

      猜你喜欢
      • 2013-01-29
      • 2019-12-05
      • 2020-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-11
      • 1970-01-01
      • 2020-01-04
      相关资源
      最近更新 更多