是否可以在列表推导中更改外部变量?

时间:2015-06-12 23:19:01

标签: python python-2.7

例如:

n = 0
i = [n=n+1 for x in range(1,(12*8)+1) if x % 2 == 0]

这只是一个愚蠢的问题,我对此没有任何实际用处。我可以使用for或while循环来实现类似的东西。如果可能,我只是感兴趣。 (假设它不是哈哈。)

3 个答案:

答案 0 :(得分:3)

您无法在列表理解机构中进行分配。语言规范仅允许expressions。但是,这意味着您可以调用具有副作用的方法。例如,您可以调用list.append来修改其他列表,例如

>>> lst = []
>>> [lst.append(i) for i in range(5)]
[None, None, None, None, None]
>>> lst
[0, 1, 2, 3, 4]

但这很少有用,而且大多数时候最终都会出现更混乱的表达方式。建议将其拆分为循环标准;这也避免了生成列表的开销。

答案 1 :(得分:0)

不完全是。在Python中,表达式不能分配,并且赋值不作为值。因此,您的代码会产生语法错误。

如果您只对n感兴趣,可以做些什么:

from collections import Counter

n = Counter(True for x in range(1, (12*8)+1) if x % 2 == 0)[True]

如果您只对i感兴趣,请使用@ poke的答案:

i = []
[i.append(x) for x in range(1, (12*8)+1) if x % 2 == 0]
i

那就是说,表达不必是无副作用的。如果您同时需要in,则可以执行以下操作:

class Count:
    def __init__(self, value=0):
        self._value = value

    @property
    def incr(self):
        self._value += 1
        return self._value

    def __int__(self):
        return self._value

n = Count(0)
i = [n.incr for x in range(1, (12*8) + 1) if x % 2 == 0]
n = int(n)

答案 2 :(得分:0)

我参加聚会已经很晚了,但我遇到了类似的编码问题(在 O(n) 中从另一个数组中获取最大子数组,所以我希望一次传递新数组及其总数,而不是使用sum),您可以通过定义自定义函数:

n = 0
def inc_n(x):
  global n
  n += 1
  return x

i = [inc_n(x) for x in range(1,(12*8)+1) if x % 2 == 0]