迭代解包在第一次迭代后导致空对象的结果

4
使用 * iterable unpacking 操作符,我希望保留一个变量的内容,以便在代码中多次使用该变量。 这里是一个表达我想要的小例子:
>>> a = 1
>>> b = None
>>> c = None
>>> args = (x for x in (a, b, c) if x is not None)
>>> print(*args)
>>> 1
>>> print(*args)
>>> 

第二次打印没有返回任何内容,因为在第一次打印语句期间已经对args进行了解包。
是否有一种方法可以通过仍然使用 * 功能来保留变量的内容?显然,我可以将 (x for x in (a, b, c) if x is not None) 委托给一个专门的函数,我会一直调用它。我想知道是否有更简单/更符合Python风格的方法来处理这个操作。

第二个 print 没有输出任何内容,因为生成器已经被耗尽(确实是通过解包来完成的,但这只是一个副作用 - 如果使用列表或元组就不会有这个问题)。 - bruno desthuilliers
1个回答

5
你需要使用 [x for x in (a, b, c) if x is not None](带方括号)而不是 (x for x in (a, b, c) if x is not None)(...)创建一个生成器,一旦被迭代就会变成空。而 [...] 是列表解析的语法,它返回一个列表。
例如:
>>> a = 1
>>> b = None
>>> c = None
>>> args = [x for x in (a, b, c) if x is not None]
>>> print(*args)
1
>>> print(*args)
1

1
谢谢,完美的答案!又是工具箱里的一个小技巧。 - Michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接