的Python 2
的n
變量列表中的理解所用的相同n
如在被傳遞。
的理解它設置爲1
,2
,然後最後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):-)的 修改之後將在'之前'打印。
或者[this one](http://stackoverflow.com/questions/19848082/why-do-list-comprehensions-write-to-the-loop-variable-but-generators-dont) – roippi