2010-09-27 147 views
0

我發現了一個錯誤:name 'i' is not defined什麼是寫這個列表理解的正確方法?

k = [ [ rids[i][j][0]['a'] * rids[i][j][1]['b'] for i in range(0,10) ] 
    for j in range(0,len(furs[i])) ] 

k = [ rids[i][j][0]['a'] * rids[i][j][1]['b'] for i in range(0,10) 
    for j in range(0,len(furs[i])) ] 

作品出奇!

編輯:什麼是寫他們的正確方法?我試圖用i作爲迭代器生成一個2D矩陣,作爲for循環的迭代器,作爲外循環& j。

回答

1

仔細看第二個for循環:for j in range(0,len(furs[i]))。即使它是在前面的第一個列表理解([ rids[i][j][0]['a'] * rids[i][j][1]['b'] for i in range(0,10) ])中創建和使用的,您在這裏指的是i

i僅限於第一次理解的範圍;從而對第二種理解是不可見的。因此你會得到錯誤。

第二個變體的工作原理是因爲ij都是在相同的列表理解中聲明和使用的。

讓我們簡化一小段代碼。試試這個:

>>> [ [ i * j for i in range(0,10) ] for j in range(0, i) ] 

Traceback (most recent call last): 
    File "<pyshell#35>", line 1, in <module> 
    [ [ i * j for i in range(0,10) ] for j in range(0, i) ] 
NameError: name 'i' is not defined 
>>> 

下面結合的內涵,從而使ij到相同的範圍:

>>> [ i * j for i in range(0,10) for j in range(0, i) ] 
[0, 0, 2, 0, 3, 6, 0, 4, 8, 12, 0, 5, 10, 15, 20, 0, 6, 12, 18, 24, 
30, 0, 7, 14, 21, 28, 35, 42, 0, 8, 16, 24, 32, 40, 48, 56, 0, 9, 
18, 27, 36, 45, 54, 63, 72] 
>>> 

現在(面露= P)再次嘗試先理解:

>>> [ [ i * j for i in range(0,10) ] for j in range(0, i) ] 
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18], [0, 3, 6, 9, 12, 15, 18, 21, 24, 27], 
[0, 4, 8, 12, 16, 20, 24, 28, 32, 36], [0, 5, 10, 15, 20, 25, 30, 35, 40, 45], 
[0, 6, 12, 18, 24, 30, 36, 42, 48, 54], [0, 7, 14, 21, 28, 35, 42, 49, 56, 63], 
[0, 8, 16, 24, 32, 40, 48, 56, 64, 72]] 
>>> 

大達!它的作品,但給出了不同的結果。這是爲什麼?原因是在示例2之後的最外層範圍中可以使用(最後一個)的值i。也就是說,在列表理解中創建的變量在REPL範圍中可用。

(PS:我相信上面的段落可以被改寫更好Pythonistas這裏,請大家幫幫忙。)

爲了驗證這一點,請嘗試刪除i並再次運行例子3。

>>> del i 
>>> [ [ i * j for i in range(0,10) ] for j in range(0, i) ] 

Traceback (most recent call last): 
    File "<pyshell#41>", line 1, in <module> 
    [ [ i * j for i in range(0,10) ] for j in range(0, i) ] 
NameError: name 'i' is not defined 
>>> 

我們又回到原點了。

1

for j in range(0,len(furs[i]))在您的第一個示例中:i由於前面的]而不在此處。

0

k = [ [ rids[i][j][0]['a'] * rids[i][j][1]['b']
for i in range(0,10) ] for j in range(0,len(furs[i])) ]
在上述聲明中,我只存在到第一個]並且此後我不在範圍之內。

相關問題