Python iterable解包在第一次迭代后产生空对象

Python iterable解包在第一次迭代后产生空对象,python,python-3.x,list,generator,Python,Python 3.x,List,Generator,使用*iterable unpacking运算符功能,我希望维护变量的内容,以便可以在代码中的多个位置使用该变量。 下面是一个小例子,表达了我的想法: >>> a = 1 >>> b = None >>> c = None >>> args = (x for x in (a, b, c) if x is not None) >>> print(*args) >>> 1 >>&g

使用*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)
>>> 
第二次打印不返回任何内容,因为在第一次
print
语句期间,
args
已解压缩


有没有办法通过仍然使用*功能来维护变量的内容?显然,我可以将
(x代表(a,b,c)中的x,如果x不是None)
委托给一个我将一直调用的专用函数。我想知道是否有一种更简单/更具python风格的方法来处理这个操作。

如果x不是无,你需要使用
[x代表(a,b,c)中的x,如果x不是无]
(带方括号)而不是
(x代表(a,b,c)中的x,如果x不是无)

(…)
创建一个生成器,该生成器在迭代后变为空。而
[…]
是返回列表的列表理解语法

例如:

>>> 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

谢谢,完美的答案!工具箱中的另一个技巧第二个
print
什么也不打印,因为生成器已经用完了(实际上是通过解包,但这只是一个副作用-使用列表或元组不会有问题)。