代码之家  ›  专栏  ›  技术社区  ›  claws

写这个清单的正确方法是什么?

  •  0
  • claws  · 技术社区  · 15 年前

    我得到一个错误: 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作为outer for循环的迭代器,j作为inner for循环的迭代器。

    3 回复  |  直到 15 年前
        1
  •  1
  •   Manoj Govindan    15 年前

    仔细看第二个 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) ] ).

    局限于第一种理解的范围,因此第二种理解是看不见的。因此你得到了错误。

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

    >>> [ [ 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之后的最外层范围中可用。也就是说,在列表中创建的变量在REPL作用域中可用。

    要验证这一点,请尝试删除 再次运行示例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
    >>> 
    

        2
  •  1
  •   fredley    15 年前

    for j in range(0,len(furs[i])) i ] .

        3
  •  0
  •   sheki    15 年前

    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])) ]
    在上面的陈述中,我只存在到第一个 ] 在那之后我就不在范围之内了。