Как правильно написать этот список? - PullRequest
0 голосов
/ 27 сентября 2010

Я получаю сообщение об ошибке: 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])) ]

работает на удивление!

РЕДАКТИРОВАТЬ: Как правильно написать это им? Я пытаюсь сгенерировать 2D матрицу с i в качестве итератора для цикла external и j в качестве итератора для цикла for.

Ответы [ 3 ]

1 голос
/ 27 сентября 2010

Посмотрите внимательно на второй for цикл: for j in range(0,len(furs[i])).Вы ссылаетесь на i здесь, даже если он создан и используется в предыдущем понимании первого списка ([ rids[i][j][0]['a'] * rids[i][j][1]['b'] for i in range(0,10) ]).

i ограничено рамками первого понимания;таким образом, это не видно для второго понимания.Следовательно, вы получаете ошибку.

Второй вариант работает, потому что и i, и j объявлены и используются в одном и том же списке.

Давайте немного упростим фрагмент кода.Попробуйте это:

>>> [ [ 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
>>> 

Теперь объедините понимания, тем самым приведя i и j в одну и ту же область:

>>> [ 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]]
>>> 

Та да!Это работает, но дает другой результат .Почему это так?Причина в том, что (последнее) значение 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 голос
/ 27 сентября 2010

for j in range(0,len(furs[i])) в вашем первом примере: i здесь не входит в сферу действия из-за предшествующего ].

0 голосов
/ 27 сентября 2010

k = [ [ rids[i][j][0]['a'] * rids[i][j][1]['b']<br> for i in range(0,10) ] for j in range(0,len(furs[i])) ] В вышеприведенном утверждении я существует только до первого ] и после этого выходит за рамки.

...