在列表理解期间使用append更改列表

5 python list-comprehension

警告:对于代码打高尔夫球来说,这是一个直截了当的问题,所以我知道我要问的是生产中的不良做法

我正在尝试在列表理解期间更改数组,但由于某种原因它挂起,我不知道为什么或如何解决这个问题.

我正在处理一系列不确定深度的列表,需要将它们压缩到一个平面列表中 - 对于那些好奇的人来说这个问题.但是在这个阶段,我只想说我需要列表中所有元素的平面列表,如果它是列表则需要0.

通常的方法是遍历列表,如果它的列表将其添加到结尾,如下所示:

for o in x:
 if type(o)==type([]):x+=o
 else:i+=o
print i
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用列表理解来缩短它,就像这样.

print sum([
 [o,x.append(o) or 0][type(o)==type([])]
 for o in x
]))
Run Code Online (Sandbox Code Playgroud)

现在,我知道List.append返回None,所以为了确保我得到一个数值,懒惰的评估说我可以做x.append(o) or 0,而且因为它None是"假的"它将评估第二部分,值是0.

但事实并非如此.如果我把x.append()列表理解结束x,它不会中断或错误,或者返回迭代错误,它只是冻结.为什么append在列表理解期间冻结,但for上面的循环工作正常?

编辑:为了防止这个问题被删除,我不是在寻找高尔夫球技巧(尽管他们非常有教育意义),我一直在寻找答案,为什么代码不能像我写的那样工作.

jwo*_*der 8

or可能是懒惰的,但列表定义不是.对于每个oin x,当[o,x.append(o) or 0][type(o)==type([])]评估monstrosity 时,Python必须进行评估[o,x.append(o) or 0],这意味着评估x.append(o) or 0,这意味着无论是否是列表,o都将附加到其中x.因此,您最终会x附加到每个元素x,然后它们会一次又一次地被追加OutOfMemoryError