列表推导式返回值加[None, None, None],为什么?

10

我正在学习推导式。我理解print(x)部分(我想它打印通过“in”测试的x的值),但为什么它还会返回一个None列表?

>>> g
['a', 'x', 'p']

>>> [print(x) for x in g]
a
x
p
[None, None, None] #whats this? 

2
那是 print() 函数的返回值。 - squiguy
我不太明白... 我以为print返回的是a,然后是x,然后是p。 - jason
我认为,如果您使用Python 2.7,[print(x)for x in g]不会评估任何内容。 - zs2020
抱歉,我忘记说了,这是关于Python 3的内容。 - jason
1
值得一提的是,正确的做法不是使用推导式,即 for x in g: print(x) - Andy Hayden
显示剩余2条评论
4个回答

21

print 是 Python3 中的一个函数,它能够将内容输出到屏幕上,但是它的返回值是 None

在 Python2 中,print 是一个语句。在列表推导式中,只有表达式而非语句才可以使用。例如,[print(x) for x in g] 会引发 SyntaxError 错误。函数调用是一个表达式,这也是为什么 Python3 允许在列表推导式中使用 print 的原因。但是,正如你所看到的,即使允许使用,使用 print 在列表推导式中也没有多大用处。


我会更明确地表达。如果你不需要一个列表,那就不要使用列表推导式。仅仅为了它的副作用而使用列表推导式是不符合Python风格的。 - Steven Rumbalski
1
没错。这是“不符合Python风格”的,因为它构建了一个(可能很大的)列表,消耗内存但从未使用。 - unutbu
@StevenRumbalski 我看到了一些非常巧妙的方法,利用生成器表达式仅用于副作用(我认为这可以是Pythonic的),但它们不能与print一起使用(所以显然这不是这样的一个例子)。 - Andy Hayden

9

你可以使用列表推导式打印列表中的项目,然后再打印整个列表。尝试将列表赋值给一个变量。

>>> g
['a', 'x', 'p']

>>> x = [print(x) for x in g]
a
x
p
#

现在列表在x中并未被打印。该列表仍然存在...
>>> print(x)
[None, None, None]
>>> x
[None, None, None]

仅将结果分配给变量就会使“Nones”消失……让人脑炸。我测试了一下,你是对的。 - jason
3
"Nones还在,它们只是存在变量'x'中。当您在解释器中时,任何未分配给变量的内容都会被打印出来。您的头脑可以恢复正常。" - tdelaney
我认为正确的建议是放弃列表推导式。赋值仅通过使用不必要的名称污染命名空间来隐藏错误。 - Steven Rumbalski

2
[print(x) for x in g]

等同于:

l = []
for i in g:
    l.append(print(i))
return l

Print是用于打印输出的函数,所以你看到了a、x和p,但它返回None,因此最终得到的列表是[None, None, None]。


1
我觉得你把列表推导和str.join方法混淆了。 列表推导总是生成一个新的列表。有三种方式可以生成与g相同的列表。
>>> [x for x in 'axp']
['a', 'x', 'p']
>>> [x[0] for x in ['alpha', 'xray', 'papa']]
['a', 'x', 'p']
>>> list('axp')
['a', 'x', 'p']

由于g已经是字符串,您可以使用join将其组合成一个字符串以打印:

>>> g=['a', 'x', 'p']
>>> ''.join(g)
'axp'

要打印它,只需使用所需的分隔符进行连接:

>>> print('\n'.join(g))
a
x
p

如果列表元素不兼容join,即为字符串,则需要使用推导式:
>>> li=[1,2,3]
>>> '\n'.join(li)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sequence item 0: expected str instance, int found
>>> print('\n'.join(str(e) for e in li))
1
2
3

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