2013-12-11 20 views
4
def nrooks(n): 
    #make board 
    print n # prints 4 
    arr = [0 for n in range(n)] # if 0 for n becomes 0 for x, it works fine 
    print n # prints 3 instead of 4 

nrooks(4) 

爲什麼第二n變得3,不同從給定的參數?在列表理解Python中怪異的行爲

+0

或者[this one](http://stackoverflow.com/questions/19848082/why-do-list-comprehensions-write-to-the-loop-variable-but-generators-dont) – roippi

回答

4

的Python 2

n變量列表中的理解所用的相同n如在被傳遞。

的理解它設置爲12,然後最後3

取而代之的是,將其更改爲

arr = [0 for _ in range(n)] 

或(令人驚訝!)

arr = list(0 for n in range(n)) 

的Python 3

這已得到修復。

From the BDFL himself

我們在Python 3製造另一個變化,以提高列表內涵和發電機表達式之間等價 。在Python 2, 列表解析「泄漏」循環控制變量到 周圍範圍:

x = 'before' 
a = [x for x in 1, 2, 3] 
print x # this prints '3', not 'before' 

這是最初的實現列表 推導的僞影;它是 年以來Python的「髒小祕密」之一。它最初是作爲一個故意的妥協,讓清單 盲目快速的解釋,雖然它不是一個初學者常見的陷阱 ,它肯定會偶爾刺痛人。對於發生器 表達式我們無法做到這一點。使用發電機發電機表達式 實施,其執行需要一個單獨的 執行框架...

然而,在Python 3,我們決定使用相同的實施策略,以固定的 列表理解的「骯髒的小祕密」爲 生成器表達式。因此,在Python 3中,上面的示例(在使用print(x):-)的 修改之後將在'之前'打印。