2015-06-12 70 views
0

例如:是否可以在列表理解中改变外部变量?

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

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

+0

预计输出是什么....我在这里有点困惑.... –

+1

你试过了吗?错误吗? – IMSoP

+0

他的范围表达式很吸引人,但我假设(取代范围(1,5)'),OP希望'i'是[1,2,3,4];和'n'为4. – vmg

回答

3

你不能让列表理解机构内部分配。语言规范只允许expressions。不过,这意味着你可以调用有副作用的方法。例如,您可以拨打list.append修改不同的列表,例如

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

但是这很少用,大部分时间都以一个更加混乱的表达式结束。现在更推荐将它分割成循环标准,这也避免了生成列表的开销。

+0

感谢你们,这只是一个愚蠢的无用的想法,我想看看是否有可能。 – SeedyROM

0

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

你能做什么,而不是,如果你只是感兴趣的n

from collections import Counter 

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

如果你在i只是感兴趣,去@捅的回答是:

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) 
相关问题