NameError嵌套推导[重复](NameError in nested comprehensio

2019-06-27 19:16发布

这个问题已经在这里有一个答案:

  • 从列表理解访问类变量在类定义 5个回答

我有这样的代码在一个文件

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

当我运行python broken.py ,我得到了回溯:

Traceback (most recent call last):
  File "U:\broken.py", line 1, in <module>
    class Sudoku(dict):
  File "U:\broken.py", line 3, in Sudoku
    {(x, y) for y in xrange(9)} for x in xrange(9)
  File "U:\broken.py", line 3, in <setcomp>
    {(x, y) for y in xrange(9)} for x in xrange(9)
NameError: global name 'x' is not defined
[Finished in 0.1s with exit code 1]

我真的不看到这里的问题。 是不是x在修真界定?


什么是陌生人是如何,这似乎时直接粘贴到Python解释器没有错误执行...


编辑 :这工作,如果我用一个列表理解,而不是一套理解

Answer 1:

我已经提交了错误在这里 。 这是 还是破 在蟒蛇2.7.5设计。

从错误报告:

在Python 2,列表内涵没有自己的范围,所以x在你最初的例子在生活类范围。 然而,设定的理解确实有它自己的范围。 通过设计,在类范围内定义的变量不是该类别内侧内范围是可见的。

在Python 3,这工作,因为该名单的理解都有自己的范围。



Answer 2:

胡乱猜测,但是Python设置内涵都与Python 2.7和3.0介绍:你碰巧使用旧版本执行脚本,以及最近的一个作为你的解释?


细算本节 Python文档中,我看到这种行为没有任何解释。 此外,它的工作原理与列表理解的事实清楚地表明,它不是一个范围问题。

我看到的只有两个可能的原因:

  • 在集合内涵实现中的错误
  • 使用不支持集推导的前Python版本。


Answer 3:

我怕我不知道为什么你的代码是不工作的。然而,以下的作品,给你你想要什么:

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

也许有的本网站上的蟒蛇大师可以启发我们,为什么您的代码段失败。



Answer 4:

我希望我可以给一个理论解释,但这个工程:

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

if __name__ == "__main__":
    s = Sudoku()
    print s.COLUMNS


Answer 5:

这也许它你真正想要的:

[[{x:y} for x in xrange(9)] for y in xrange(9)]


文章来源: NameError in nested comprehensions [duplicate]