16

我在文件中有这段代码

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 解释器中时,这似乎执行起来没有错误......


编辑:如果我使用列表理解而不是集合理解,则此方法有效

4

5 回答 5

8

我在这里提交了一个错误。这是还是坏了在 python 2.7.5 中设计。

从错误报告中:

在 Python 2 中,列表推导没有自己的范围,因此x在您的初始示例中,您的示例位于类范围内。但是,集合推导确实有自己的范围。按照设计,在类范围内定义的变量对该类内部的范围不可见。

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

于 2013-05-31T23:11:38.747 回答
3

疯狂的猜测,但是 Python 2.7 和 3.0 引入了 Python 集合推导:你会碰巧使用旧版本来执行你的脚本,并使用最近的一个作为你的解释器吗?


在查看了 Python 文档的这一部分后,我没有看到对这种行为的解释。此外,它与列表理解一起使用的事实清楚地表明它不是范围问题。

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

  • 集合推导实现中的错误
  • 使用不支持集合推导的前 Python 版本。
于 2012-09-04T08:33:58.227 回答
2

恐怕我不知道为什么您的代码无法正常工作,但是,以下工作可以为您提供所需的内容:

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

也许这个网站上的一些 python 大师可以启发我们为什么你的代码片段会失败。

于 2012-09-04T08:26:32.190 回答
1

我希望我能给出一个理论上的解释,但这有效:

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
于 2012-09-04T08:21:08.770 回答
1

也许这就是你真正想要的:

[[{x:y} for x in xrange(9)] for y in xrange(9)]
于 2012-09-04T08:21:45.697 回答