Python2:在class里面的list里面的可迭代内容会导致错误

时间:2018-02-10 03:26:57

标签: python python-2.7 class list-comprehension

以下代码

class Foo:
    bar=[sum( i^j for i in range(9) )for j in range(9)]

加注

NameError: global name 'j' is not defined

在我的Python 2.7.14 IDLE上,以及在线翻译。

如果我理解正确,sum接受iterable作为输入。 出了什么问题?

PS。

  • 如果我使用sum([ ... ])代替,则不会有错误。
  • 如果删除外部列表,则不会出现错误。
  • 如果第二行在课外执行,则不会有错误。
  • Python3(特别是我的3.4.2 IDLE)不会引发错误。

1 个答案:

答案 0 :(得分:2)

看来这是一个带有Python 2的known issue

  

在Python 2中,列表推导没有自己的范围,所以x   在您的初始示例中,您处于类范围。但是,这套   理解确实有自己的范围。按设计,定义一个变量   在类范围内的内部范围不可见。

     

在Python 3中,这是有效的,因为列表推导有自己的   范围。

给出的例子是:

class Sudoku(dict):
    COLUMNS = [
        {(x, y) for y in xrange(9)} for x in xrange(9)}
    ]