【发布时间】: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
-
参见上面关于可变默认参数的编辑