我创建了一个行,以下面的方式将一个对象附加到列表中
>>> foo = list()
>>> def sum(a, b):
... c = a+b; return c
...
>>> bar_list = [9,8,7,6,5,4,3,2,1,0]
>>> [foo.append(sum(i,x)) for i, x in enumerate(bar_list)]
[None, None, None, None, None, None, None, None, None, None]
>>> foo
[9, 9, 9, 9, 9, 9, 9, 9, 9, 9]
>>>
线
^{pr2}$会给一个pylint W1060表达式赋值为nothing,但由于我已经在使用foo list来附加值,所以不需要将list理解行赋给某个东西。在
我的问题更多的是关于编程正确性的问题
我应该放弃列表理解而只使用一个简单的for表达式吗?在
>>> for i, x in enumerate(bar_list):
... foo.append(sum(i,x))
或者,有没有一种正确的方法可以同时使用列表理解和赋值给无?在
回答
谢谢@user2387370,@kindall和@Martijn Pieters。对于其余的注释,我使用append是因为我没有使用list(),我没有使用I+x,因为这只是一个简化的示例。在
我留下如下:
histogramsCtr = hist_impl.HistogramsContainer()
for index, tupl in enumerate(local_ranges_per_histogram_list):
histogramsCtr.append(doSubHistogramData(index, tupl))
return histogramsCtr
是的,这是不好的风格。列表理解就是建立一个列表。您正在构建一个满是
None
s的列表,然后将其丢弃。你实际想要的结果是这种努力的副作用。在为什么不首先使用列表理解来定义
foo
?在如果它不是一个列表,而是某个其他容器类,正如您在另一个答案的注释中所提到的,请编写该类以在其构造函数中接受iterable(或者,如果不是您的代码,则将其子类化为这样做),然后向它传递一个生成器表达式:
^{pr2}$如果
foo
已经有一些值,并且您希望附加新项:如果您真的想使用
append()
并且出于某种原因不想使用for
循环,那么您可以使用这个结构;生成器表达式至少可以避免在您不想要的列表上浪费内存和CPU周期:但是这比常规的
for
循环要差得多,而且还有一些额外的工作要做:any
在每次迭代中测试foo.append()
的返回值。您可以编写一个函数来使用迭代器并消除检查;最快的方法是使用零长度collections.deque
:这实际上是相当可读的,但我相信它实际上并不比}都比
any()
快,并且需要额外的导入。但是,do()
或{for
循环快一点,如果需要考虑的话。在我认为仅仅为了副作用而使用列表理解通常是不受欢迎的,所以在这种情况下我会说for循环更好。在
但不管怎样,你就不能这样做吗?在
你应该绝对放弃列表理解。结束。在
在你的简化案例中,你忽略了你可以直接使用列表理解的事实:
相关问题 更多 >
编程相关推荐