1

在调查我的其他问题时,我遇到了一个非常奇怪的行为。

运行代码:

def test(prefix, custom_meta_files = []):
  postfix = 'tgz'  
  if prefix[-1] != '.':
    postfix = '.tgz'

  archive = tarfile.open(prefix+postfix, "w:gz")
  files = filter(lambda path: path.startswith(prefix), os.listdir())
  print('files: {0}'.format(list(files)))
  print('files: {0}'.format(list(files)))


files: ['ga_run.seq_niche.N30.1.bt0_5K.params', 'ga_run.seq_niche.N30.1.bt0_5K.stats', 'ga_run.seq_niche.N30.1.bt0_5K.tgz']
files: []

似乎强制转换filter objectlist清除它。为什么会这样,是否需要?

4

2 回答 2

1

嗯...我可能会变得愚蠢。但我又开始阅读文档,我想我找到了原因。我将其发布为自我回答,因为我认为这个问题是有效的,不值得或删除。

文档说:“请注意,如果函数不是None,则filter(function,iterable)等效于生成器表达式(item for item in iterable if function(item))和(item for item in iterable if item)如果函数为None。 "

因此,如果它充当生成器,则它可能会在生成器上进行迭代并有效地“清空”它。

不过,如果有任何 python 专家能指出这是否是正确的思维方式,我将不胜感激。

于 2013-07-24T15:14:36.867 回答
0

当你这样做时:

list(files)

您实际上正在使用返回的生成器filter来创建列表(顺便说一句,它不是“强制转换”),因此第二次编写list(files)生成器时已经完成。这应该可以解决它,并且将重复的结果存储在变量中也是一个好主意 - 它避免了重新计算值:

lst = list(files)
print('files: {0}'.format(lst))
print('files: {0}'.format(lst))
于 2013-07-24T15:13:33.183 回答